################################################################################
##
##  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
#   FLASHPLAYER_DEBUGGER
#   PLAYERGLOBAL_HOME
#   PIXELBENDER_HOME
#   ADOBE_EXTENSION_MANAGER
#
# 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 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 the Adobe Pixel Bender Toolkit
# for your platform.
#
# On Windows (32-bit), if installed to the default location, the setting would be
#   env.PIXELBENDER_HOME=C:\\Program Files\\Adobe\\Adobe Utilities - CS5\\Pixel Bender Toolkit 2
#
# or on a 64-bit version of Windows
#	env.PIXELBENDER_HOME=C:\\Program Files (x86)\\Adobe\\Adobe Utilities - CS5\\Pixel Bender Toolkit 2
#
# Note: the folder "Program Files" (or "Program Files (x86)") might have a different name
# depending on the language of your Windows installation.
#
# On Mac, if installed to the default location, the setting would be
#   env.PIXELBENDER_HOME=/Applications/Utilities/Adobe Utilities-CS5.localized/Pixel Bender Toolkit 2/
#
#env.PIXELBENDER_HOME=

#
# Set this to the file that contains the Adobe Extension Manager CS5
# for your platform.  This is optional and is only required for those
# who need flash integration in order to build the MXP for the flash integration kit.
#
# On Windows (32-bit), if installed to the default location, the setting would be
#   env.ADOBE_EXTENSION_MANAGER=C:\\Program Files\\Adobe\\Adobe Extension Manager CS5\\Adobe Extension Manager CS5.exe
#
# or on a 64-bit version of Windows
#   env.ADOBE_EXTENSION_MANAGER=C:\\Program Files (x86)\\Adobe\\Adobe Extension Manager CS5\\Adobe Extension Manager CS5.exe
#
# Note: the folder "Program Files" (or "Program Files (x86)") might have a different name
# depending on the language of your Windows installation.
#
# On Mac, if installed to the default location, the setting would be
#   env.ADOBE_EXTENSION_MANAGER=/Applications/Adobe Extension Manager CS5/Adobe Extension Manager CS5.app/Contents/MacOS/Adobe Extension Manager CS5
#
#env.ADOBE_EXTENSION_MANAGER=

