<!--

  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.

-->
<flex-config>

  <compiler>

    <accessible>false</accessible>
    <debug>$debug</debug>

    <library-path>
      #foreach($artifact in $libraries)           <path-element>$artifact.file</path-element>
      #end
    </library-path>

    <external-library-path>
      #foreach($artifact in $externalLibraries)           <path-element>$artifact.file</path-element>
      #end
    </external-library-path>

    <source-path>
      #foreach($sourcePath in $sourcePaths)           <path-element>$sourcePath</path-element>
      #end
    </source-path>

    <namespaces>
      #foreach($namespace in $namespaces)            <namespace>
      <uri>$namespace.uri</uri>
      <manifest>$namespace.manifest</manifest>
    </namespace>
      #end
    </namespaces>

    <warn-no-constructor>false</warn-no-constructor>

    <keep-as3-metadata>
      #foreach($metadata in $keepAs3Metadata)            <name>$metadata</name>
      #end
    </keep-as3-metadata>

    <allow-subclass-overrides>$allowSubclassOverrides</allow-subclass-overrides>

    <mxml>
      <children-as-data>true</children-as-data>
    </mxml>

    <binding-value-change-event>org.apache.flex.events.ValueChangeEvent</binding-value-change-event>
    <binding-value-change-event-kind>org.apache.flex.events.ValueChangeEvent</binding-value-change-event-kind>
    <binding-value-change-event-type>valueChange</binding-value-change-event-type>

    <show-deprecation-warnings>false</show-deprecation-warnings>

    #foreach($define in $defines)        <define>
    <name>$define.name</name>
    <value>$define.value</value>
  </define>
    #end
  </compiler>

  #if($includeSources)
  <include-sources>
    #foreach($sourcePath in $sourcePaths)        <path-element>$sourcePath</path-element>
    #end
  </include-sources>
  #end

  #if($includeClasses)
  <include-classes>
    #foreach($includeClass in $includeClasses)        <class>$includeClass</class>
    #end
  </include-classes>
  #end

  #if($namespaceUris)
  <include-namespaces>
    #foreach($namespaceUri in $namespaceUris)        <uri>$namespaceUri</uri>
    #end
  </include-namespaces>
  #end

  <js-output-type>FLEXJS</js-output-type>

  <keep-asdoc>true</keep-asdoc>

  <output>${output}</output>

  <doc-namespaces>
#foreach($namespace in $namespaces)    <uri>$namespace.uri</uri>
#end
  </doc-namespaces>

  <doc-sources>
#foreach($sourcePath in $sourcePaths)    <path-element>$sourcePath</path-element>
#end
  </doc-sources>

</flex-config>
