################################################################################
##
##  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.
##
################################################################################

# If you choose to use this file, copy it to ../../../../env.properties 
# (the root folder of the sources) and uncomment the
# properties you wish to set.

# For each of
#
#   AIR_HOME
#   FLASHPLAYER_DEBUGGER
#   PLAYERGLOBAL_HOME
#
# you need to set an environment variable with that name or set the property here
# prefixed with "env.".  If a property is set in this file, and the corresponding 
# environment variable is also set, the property set here takes precedence over the 
# corresponding environment variable.
#
# Use absolute file paths. 
# 
# This is a Java property file.  On Windows if you use the '\' file 
# separator you must use "\\", but not escape spaces, for example,
#
#       env.FLASHPLAYER_DEBUGGER=z:\\tools\\player\\flashplayer_11_sa_debug_32bit.exe
#
# See the README file for more information about the different variables.

#
# Set this to the directory that contains the unzipped Adobe AIR SDK for your
# platform.
#
#env.AIR_HOME=

#
# Set this to absolute path that contains the Adobe Flash Player content debugger
# for your platform.  
#
#env.FLASHPLAYER_DEBUGGER=

#
# PLAYERGLOBAL_HOME is a directory which contains one or more subdirectories.
# The name of each subdirectory corresponds to a supported target player version and
# in each of the subdirectories is the playerglobal.swc that corresponds to that target 
# player.  The default 
# 
# For this sample directory structure, set PLAYERGLOBAL_HOME to the full path of the
# player directory.
#
#       - player (dir)
#           - 11.1 (dir)
#               playerglobal.swc (file)
#
#env.PLAYERGLOBAL_HOME=

#
# Set this to the directory that contains a Royale SDK.
#
#
# On Windows (32-bit), the setting might be
#   env.ASJS_HOME =C:\\dev\\apache-royale\\royale-asjs
#
# On Mac, the setting might be
#   env.ASJS_HOME =/Users/username/dev/apache-royale/royale-asjs
#
#env.ASJS_HOME=

#
# If you use a player global that is different that the default of 11.0,
# you need to set it here.
#env.PLAYERGLOBAL_VERSION=21.0
