################################################################################
##
##  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 chose to use this file rename it to env.properties and uncomment the
# properties you wish to set.

# For each of
#
#   AIR_HOME
#   ROYALE_COMPILER_HOME
#   ROYALE_SWF_COMPILER_HOME
#   FLASHPLAYER_DEBUGGER
#   FLEX_HOME
#   FLEXUNIT_HOME
#   GOOG_HOME
#   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
#                      or
#       env.PIXELBENDER_HOME=C:\\Program Files (x86)\\Adobe\\Adobe Utilities - CS5\\Pixel Bender Toolkit 2
#
# 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 a folder with a lib folder containing compiler-mxmlc.jar.
#
#env.ROYALE_SWF_COMPILER_HOME=

#
# Set this to a folder with a lib folder containing jsc.jar
#
#env.ROYALE_COMPILER_HOME=

#
# Set this to absolute path that contains the Adobe Flash Player content debugger
# for your platform.  
#
#env.FLASHPLAYER_DEBUGGER=

#
# Set this to absolute path of an SDK or repo.  
#
#env.FLEX_HOME=

#
# Set this to the root of a FlexUnit release or repo
#
#env.FLEXUNIT_HOME=

#
# Set GOOG_HOME to the absolute path of the folder that contains the third_party
# and closure sub-folders.  
#
#env.GOOG_HOME=

#
# 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=
