<#--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
  
    http://www.apache.org/licenses/LICENSE-2.0
  
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
-->
<#macro m\-a data\-color>
    <#local \.namespace = 123>
    <a-b>${data\-color}<#nested \.namespace></a-b><#t>
</#macro>
<#macro "m-b2"></#macro>
<#macro "m/b2"></#macro>

<@m\-a data\-color="red"; loop\-var, loopVar2>${loop\-var}</@>

<#function f\-a p\-a>
    <#return p\-a + " works">
</#function>
${f\-a("f-a")}

<#assign \-\-\-\.\: = 'dash-dash-dash etc.'>
${\-\-\-\.\:}
${.vars['---.:']}
<#assign hash = { '--moz-prop': 'propVal' }>
${hash.\-\-moz\-prop}
${hash['--moz-prop']}

<#assign ls\:a = 1..3>
List: <#list ls\:a as \:i>${\:i}</#list>

<#assign sw\-a=1>
Switch: <#switch sw\-a>
    <#case 1>OK<#break>
    <#default>Fails
</#switch>

<#escape \-x as \-x?upper_case>${'escaped'}</#escape>

<#if false && sw\-a == 1>
    <#visit x\-y2 using x\-y1>
    <#recurse x\-y2 using x\-y1>
    <#import i\-a as i\-b>
    <#include i\-c>
</#if>

<#assign @as@_a = 'as1'>
${@as@_a}
<#assign 'as-c' = 'as2'>
${.vars['as-c']}
<#assign "as/b" = 'as3'>
${.vars["as/b"]}
<#assign "as'c" = 'as4'>
${.vars["as'c"]}
<#assign 'as"d' = 'as5'>
${.vars['as"d']}

<#global g\-a=1 g\-b=2 "g-c"=3>

<#macro dumpNS>
    <#list .namespace?keys?sort as k>
        ${k} = <#local v = .namespace[k]><#if v?is_string>${v}<#else>...</#if><#lt>
    </#list>
</#macro>
<@dumpNS />
