зеркало из
1
0
Форкнуть 0
This commit is contained in:
Olivier Goguel 2016-03-25 23:52:38 +01:00
Родитель 33bb21f083
Коммит db0e42347d
120 изменённых файлов: 8986 добавлений и 1 удалений

10
.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,10 @@
.gradle
local.properties
.idea/workspace.xml
.idea/libraries
.DS_Store
build/
captures/
engagement-project/
~build/
sample/SampleProject/

Просмотреть файл

@ -0,0 +1,7 @@
Azure Mobile Engagement Android SDK
Copyright (c) Microsoft Corporation
All rights reserved.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Просмотреть файл

@ -0,0 +1,7 @@
Azure Mobile Engagement iOS SDK
Copyright (c) Microsoft Corporation
All rights reserved.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Двоичные данные
Engagement.unitypackage Normal file

Двоичный файл не отображается.

154
README.md
Просмотреть файл

@ -1 +1,153 @@
# Placeholder for Azure Mobile Engagement Unity SDK
## Azure Mobile Engagement : Unity SDK
### Installation
* Import the`Engagement.unitypackage`into your Unity project
* Edit the configuration file `EngagementPlugin/EngagementConfiguration.cs` with your credentials
* Add the SDK APis into your code (see the *Integration* Section)
* Excute *File/Engagement/Generate Android Manifest* to update your project settings (needed to be executed everytime the configuration file is beging modified)
### Configuration
The configuration of your application is performed via an `EngagementConfiguration` class located in the `EngagementPlugin/` directory.
##### Engagement Configuration
###### Android
- `ANDROID_CONNECTION_STRING` : the Android connection string (to retrieve from the Engagement portal)
- `ANDROID_UNITY3D_ACTIVITY`: needs to be filled if your application does not use the default Unity Activity (`com.unity3d.player.UnityPlayerActivity`)
###### iOS
- `IOS_CONNECTION_STRING` : the iOS connection string (to retrieve from the Engagement portal)
- `IOS_DISABLE_IDFA` : `true`|`false` : to disable the IDFA integration on iOS
###### Generic
- `ENABLE_PLUGIN_LOG` : `true`|`false`, enable the plugin debug logs
- `ENABLE_NATIVE_LOG` : `true`|`false`, enable the Engagement native SDK to debug logs
- It is recommended to set both to `true` while working on the plugin integratin.
##### Location Reporting
- `LOCATION_REPORTING_TYPE`: Can be one of the following (please refer to the Native SDK documentation for more information)
* `LocationReportingType.NONE`
* `LocationReportingType.LAZY`
* `LocationReportingType.REALTIME`
* `LocationReportingType.FINEREALTIME`
- `LOCATION_REPORTING_MODE`: Can be one of the following (please refer to the Native SDK documentation for more information)
* `LocationReportingMode.NONE`
* `LocationReportingMode.FOREGROUND`
* `LocationReportingMode.BACKGROUND`
##### Reach support
###### Generic
- `ENABLE_REACH` : `true`|`false`, to enable the reach integration
- `ACTION_URL_SCHEME` : the url scheme of your application when using redirect actions in your campaign
###### iOS
- `IOS_REACH_ICON` : the path (relative to the *Assets/* directory) of the icon to display reach notification on iOS. If not specified, the application icon will be used
###### Android
- `ANDROID_REACH_ICON` : the path (relative to the *Assets/* directory) of the icon to display reach notification on Android. If not specified, the application icon will be used
- `ANDROID_GOOGLE_PROJECT_NUMBER` : the project number used as the GCM (Google Cloud Messaging) sender ID
##### Notes
* Do not follow the installation instruction from the Engagement native SDK for Android in iOS : in the Unity Engagement SDK, the application configuration is performed automatically (cf. `EngagementPlugin/Editor/EngagementPostBuild.cs` to see how it works under the hood).
### Basic Integration
To initialize the Engagement service, just call `EngagementAgent.Initialize()`. No arguments are needed as the credentials are automatically retrieved from the `EngagementConfiguration`class.
##### Example
Basic initialization:
```C#
void Start () {
// initialize the application
EngagementAgent.Initialize ();
// start your first activity
EngagementAgent.StartActivity ("home");
}
```
### Reach Integration
To be able to receive pushes from your application, you need to call `EngagementReach.initialize()` and define the 3 delegates (events) to be called when a push related event is received
* `StringDataPushReceived(string _category, string _body)` to receive text data push
* `Base64DataPushReceived(string _category, byte[] data, string _encodedbody)` to receive binary push (through byte[] and base64 encoded string)
* `HandleURL(string _url)` when an application specific URL is triggered (from a push campaign for example)
##### Notes
* Reach must be enabled in the configuration file by setting the `EngagementConfiguration.ENABLE_REACH`variable
* The URL scheme must match the one defined in the `EngagementConfiguration.ACTION_URL_SCHEME` setting
##### Example
Initialization with push support :
```C#
void Start () {
// initialize the Engagement Agent
EngagementAgent.Initialize ();
// set the Events
EngagementReach.HandleURL += (string _push) => {
Debug.Log ("OnHandleURL " + _push);
};
EngagementReach.StringDataPushReceived += (string _category, string _body) => {
Debug.Log ("StringDataPushReceived category:" + _category + ", body:" + _body);
};
EngagementReach.Base64DataPushReceived += (string _category, byte[] _data, string _body) => {
Debug.Log ("Base64DataPushReceived category:" + _category);
};
// Activate the push notification support
EngagementReach.Initialize();
// start your first activity
EngagementAgent.StartActivity ("home");
}
```
### Full API
##### Initialization
* `EngagementAgent.Initialize`
* `EngagementReach.Initialize`
(see above)
##### Reporting APIs
* `EngagementAgent.StartActivity`
* `EngagementAgent.EndActivity`
* `EngagementAgent.StartJob`
* `EngagementAgent.EndJob`
* `EngagementAgent.SendJobEvent`
* `EngagementAgent.SendJobError`
* `EngagementAgent.SendEvent`
* `EngagementAgent.SendError`
* `EngagementAgent.SendSessionEvent`
* `EngagementAgent.SendSessionError`
* `EngagementAgent.SendAppInfo`
(see the AZME documentation)
##### Miscellaneous:
* `EngagementAgent.SaveUserPreferences`
* `EngagementAgent.RestoreUserPreferences`
* `EngagementAgent.SetEnabled`
* `EngagementAgent.GetStatus`
### Sample Application
A sample application is available in the `sample`directory.
* Execute `build-sample.sh`to create a new sample project
* Once done, the Unity Editor should be displayed with the `sample-project`openned
* Edit the `EngagementPlugin/EngagementConfiguration.cs`with your credentials (see the configuration section)
* In the Unity *PlayerSettings*, set the bundle id for your application
* iOS:
* Go to *File/Build Settings/iOS* and press *Build* to create the XCode projet
* From XCode, activate the *Push Notification* from the *Capabilities* menu
* Build and run from XCode!
* Android:
* Go to *File/Engagement/Generate Android Manifest* to create a manifest file with the requirements for Engagement
* Go to *File/Build Settings/Android* and press *Build&Run* to launch the sample
### Building from source
The source code of the plugin are included in the `src/`directory. To build the package, just execute the `package.sh` script at the root of the SDK.
It only works on Mac OSX, with XCode, Unity and Android Studio installed.
### History
* 1.0.0 First release

73
ThirdPartyNotices.txt Normal file
Просмотреть файл

@ -0,0 +1,73 @@
THIRD-PARTY SOFTWARE NOTICES AND INFORMATION
Microsoft is offering you a license to use the following components included within the Microsoft Azure Mobile SDK subject to the terms of the Microsoft software license terms for the Microsoft Azure Mobile SDK. These notices below are provided for informational purposes only and are not the license terms under which Microsoft distributes these files. Microsoft reserves all rights not expressly granted herein.
1. Darktable - MiniJSON (https://gist.github.com/darktable/1411710)
2. DotNetZip (http://dotnetzip.codeplex.com/)
%% Darktable - MiniJSON NOTICES AND INFORMATION BEGIN HERE
=========================================
Copyright (c) 2013 Calvin Rien
Based on the JSON parser by Patrick van Bergen
http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html
Simplified it so that it doesn't throw exceptions
and can be used in Unity iPhone with maximum code stripping.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
=========================================
END OF Darktable - MiniJSON NOTICES AND INFORMATION
%% DotNetZip NOTICES AND INFORMATION BEGIN HERE
=========================================
Microsoft Public License (Ms-PL)
This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.
1. Definitions
The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.
A "contribution" is the original software, or any additions or changes to the software.
A "contributor" is any person that distributes its contribution under this license.
"Licensed patents" are a contributor's patent claims that read directly on its contribution.
2. Grant of Rights
(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
3. Conditions and Limitations
(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
=========================================
END OF DotNetZip NOTICES AND INFORMATION

21
licence.txt Normal file
Просмотреть файл

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) Microsoft Corporation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

77
package.sh Executable file
Просмотреть файл

@ -0,0 +1,77 @@
PACKAGEPATH="$PWD/Engagement.unitypackage"
rm $PACKAGEPATH
SRCDIR="$PWD/src"
#-1 Create Empty App to receive the package
UNITYPROJECTNAME="engagement-project"
UNITYPROJECT="$PWD/$UNITYPROJECTNAME"
rm -rf $UNITYPROJECT
echo "Creating $UNITYPROJECT"
UNITYAPP=/Applications/Unity/Unity.app/Contents/MacOS/Unity
$UNITYAPP -batchmode -quit -createProject $UNITYPROJECTNAME
#-2 Copy the plugin files to the project
cp -r src/EngagementPlugin "$UNITYPROJECT/Assets"
TARGETAZME="$UNITYPROJECT/Assets/EngagementPlugin"
#-3 Build the iOS Library
TARGETIOS="$TARGETAZME/iOS"
SRCIOSDIR="$PWD/src/iOS"
PROJECTFILENAME="EngagementUnity.xcodeproj"
BUILD_PATH="$PWD/~build"
BUILD_DIR="$BUILD_PATH/build-$TARGETAPP"
TMP_DIR="$BUILD_PATH/tmp-$TARGETAPP"
rm -rf "$BUILD_PATH"
rm -rf "$PROJECTDIR/$PROJECTFILENAME/build"
mkdir "$BUILD_PATH"
TARGETAPP="EngagementUnity"
CONFIG="Release"
xcodebuild -project "$SRCIOSDIR/$PROJECTFILENAME" -target "$TARGETAPP" -configuration "$CONFIG" BUILD_DIR="$BUILD_DIR" TMP_DIR="$TMP_DIR"
#-4 Copy iOS artefacts
IOSLIBRARYNAME="libEngagementUnity.a"
rm "$TARGETIOS/$IOSLIBRARYNAME"
cp "$BUILD_DIR/$CONFIG-iphoneos/$IOSLIBRARYNAME" "$TARGETIOS/$IOSLIBRARYNAME"
rm -rf "$TARGETIOS/res"
mkdir "$TARGETIOS/res"
cp "$SRCIOSDIR/EngagementReach/res/close.png" "$TARGETIOS/res"
cp "$SRCIOSDIR/EngagementReach/res/AEDefaultAnnouncementView.xib" "$TARGETIOS/res"
cp "$SRCIOSDIR/EngagementReach/res/AEDefaultPollView.xib" "$TARGETIOS/res"
cp "$SRCIOSDIR/EngagementReach/res/AENotificationView.xib" "$TARGETIOS/res"
cp "$SRCIOSDIR/EngagementSDK/Classes/AEIdfaProvider.h" "$TARGETIOS"
cp "$SRCIOSDIR/EngagementSDK/Classes/AEIdfaProvider.m" "$TARGETIOS"
#-5 Build Android library
TARGETANDROID="$TARGETAZME/Android"
ANDROIDLIBRARYNAME="libEngagementUnity.aar"
rm -rf "$TARGETANDROID"
mkdir "$TARGETANDROID"
SAVEPWD=$PWD
cd "$PWD/src/Android"
./gradlew clean
./gradlew build
cd "$SAVEPWD"
cp "$SAVEPWD/src/Android/libEngagementUnity/build/outputs/aar/libEngagementUnity-release.aar" "$TARGETANDROID/$ANDROIDLIBRARYNAME"
#-7 Build the package by launching Unity from the command line
$UNITYAPP -batchmode -quit -projectPath "$UNITYPROJECT" -exportPackage "Assets/EngagementPlugin" "$PACKAGEPATH"
#-8 Done

71
sample/Sample.cs Normal file
Просмотреть файл

@ -0,0 +1,71 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
using UnityEngine;
using System.Collections;
using System.Xml;
using System.Xml.Schema;
using System.IO;
using System.Collections.Generic;
using Microsoft.Azure.Engagement.Unity;
public class Sample : MonoBehaviour
{
private string log = "";
private int maxLine = 0;
void Start ()
{
Display("Engagement Sample");
EngagementAgent.Initialize ();
EngagementReach.HandleURL += (string _push) => {
Display ("HandleURL " + _push);
};
EngagementReach.StringDataPushReceived += (string _category, string _body) => {
Display ("StringDataPushReceived category:" + _category );
};
EngagementReach.Base64DataPushReceived += (string _category, byte[] _data, string _body) => {
Display("Base64DataPushReceived category:" + _category);
};
EngagementReach.Initialize ();
EngagementAgent.StartActivity ("home");
EngagementAgent.GetStatus (OnStatusReceived);
}
void OnStatusReceived(Dictionary<string, object> _status)
{
Display ("deviceId:"+_status["deviceId"]);
Display ("pluginVersion:"+_status["pluginVersion"]);
Display ("nativeVersion:"+_status["nativeVersion"]);
}
public void Display(string str)
{
Debug.Log (str);
maxLine++;
if (maxLine == 6) {
maxLine = 0;
log = str;
}
else
log = log +"\n"+str;
}
public void OnGUI() {
GUIStyle myStyle = new GUIStyle();
myStyle.fontSize = 32;
Rect r = new Rect ( Screen.width/4, Screen.height/4, Screen.width / 2, Screen.height / 2);
GUI.Box(r,log,myStyle);
}
}

29
sample/SampleSetup.cs Normal file
Просмотреть файл

@ -0,0 +1,29 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;
public class SampleSetup
{
static void CreateSampleScene ()
{
EditorApplication.NewEmptyScene ();
new GameObject("EngagementCamera").AddComponent<Camera>();
GameObject go = new GameObject("EngagementSample");
go.AddComponent<Sample>();
string sn = "Assets/SampleScene.unity";
EditorApplication.SaveScene (sn);
var sceneToAdd = new EditorBuildSettingsScene(sn, true);
EditorBuildSettings.scenes = new EditorBuildSettingsScene[1]{sceneToAdd};
}
}

17
sample/build-sample.sh Executable file
Просмотреть файл

@ -0,0 +1,17 @@
PROJECTNAME=SampleProject
UNITY=/Applications/Unity/Unity.app/Contents/MacOS/Unity
PROJECTPATH=$PWD/$PROJECTNAME
AZMEPACKAGEPATH=$PWD/../Engagement.unitypackage
rm -rf $PROJECTNAME
$UNITY -batchmode -quit -createProject $PROJECTNAME
$UNITY -batchmode -quit -projectPath $PROJECTPATH -importPackage $AZMEPACKAGEPATH
ASSETSPATH="$PROJECTNAME/Assets"
EDITORPATH="$ASSETSPATH/Editor"
mkdir $EDITORPATH
cp Sample.cs $ASSETSPATH
cp SampleSetup.cs $EDITORPATH
$UNITY -projectPath $PROJECTPATH -executeMethod SampleSetup.CreateSampleScene &

23
src/Android/build.gradle Normal file
Просмотреть файл

@ -0,0 +1,23 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

Просмотреть файл

@ -0,0 +1,18 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

Двоичные данные
src/Android/gradle/wrapper/gradle-wrapper.jar поставляемый Normal file

Двоичный файл не отображается.

6
src/Android/gradle/wrapper/gradle-wrapper.properties поставляемый Normal file
Просмотреть файл

@ -0,0 +1,6 @@
#Thu Oct 15 22:17:58 CEST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip

164
src/Android/gradlew поставляемый Executable file
Просмотреть файл

@ -0,0 +1,164 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

90
src/Android/gradlew.bat поставляемый Normal file
Просмотреть файл

@ -0,0 +1,90 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

1
src/Android/libEngagementUnity/.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1 @@
/build

Просмотреть файл

@ -0,0 +1,44 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "21.1.2"
/*
defaultConfig {
minSdkVersion 9
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
*/
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
// to disable error in engagement_web_announcement.xml:
disable 'WebViewLayout'
}
}
android.libraryVariants.all { variant ->
variant.outputs.each { output ->
output.packageLibrary.exclude('libs/unity-classes.jar')
}
}
repositories {
flatDir {
dirs 'res'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
}

Двоичные данные
src/Android/libEngagementUnity/libs/android-support-v4.jar Normal file

Двоичный файл не отображается.

Двоичные данные
src/Android/libEngagementUnity/libs/mobile-engagement-4.1.3.jar Executable file

Двоичный файл не отображается.

Двоичные данные
src/Android/libEngagementUnity/libs/unity-classes.jar Normal file

Двоичный файл не отображается.

17
src/Android/libEngagementUnity/proguard-rules.pro поставляемый Normal file
Просмотреть файл

@ -0,0 +1,17 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/olivier/Tools/adt-bundle/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

Просмотреть файл

@ -0,0 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.microsoft.azure.engagement.libEngagementUnity">
</manifest>

Просмотреть файл

@ -0,0 +1,119 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
package com.microsoft.azure.engagement.shared;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import java.util.TreeMap;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import com.microsoft.azure.engagement.reach.EngagementReachDataPushReceiver;
import org.json.JSONException;
import org.json.JSONObject;
public class EngagementDataPushReceiver extends EngagementReachDataPushReceiver
{
public static final String ENGAGEMENT_PREFERENCES = "EngagementDataPush";
// http://stackoverflow.com/questions/607176/java-equivalent-to-javascripts-encodeuricomponent-that-produces-identical-outpu
public static String encodeURIComponent(String s) {
if (s==null)
return null;
String result = null;
try {
result = URLEncoder.encode(s, "UTF-8")
.replaceAll("\\+", "%20")
.replaceAll("\\%21", "!")
.replaceAll("\\%28", "(")
.replaceAll("\\%29", ")")
.replaceAll("\\%7E", "~");
}
catch (UnsupportedEncodingException e) {
Log.e(EngagementShared.LOG_TAG,"Unsupported Encoding");
}
return result;
}
@TargetApi(9)
public static Map<String,String> getPendingDataPushes(Context context) {
Map<String, String> smap = new TreeMap<String, String>();
SharedPreferences settings = context.getSharedPreferences(ENGAGEMENT_PREFERENCES, 0/*MODE_PRIVATE*/);
Map<String,?> m = settings.getAll();
// convert to treemap to keep the order by timestamp
for (Map.Entry<String, ?> entry : m.entrySet()) {
smap.put(entry.getKey(), entry.getValue().toString());
}
// remove all
settings.edit().clear().apply();
return smap;
}
@TargetApi(9)
public static void addDataPush(Context context,String category, String body, boolean isBase64) {
SharedPreferences settings = context.getSharedPreferences(ENGAGEMENT_PREFERENCES, 0/*MODE_PRIVATE*/);
SharedPreferences.Editor prefEditor = settings.edit();
Long tsLong = System.currentTimeMillis()/1000;
JSONObject json = new JSONObject();
try {
json.put("isBase64",isBase64);
if (category == null)
json.put("category", JSONObject.NULL);
else
json.put("category",category);
json.put("body",body);
} catch (JSONException e) {
Log.e(EngagementShared.LOG_TAG, "Cannot store push");
return ;
}
String ts = tsLong.toString();
String value= json.toString(); //category+" "+body;
prefEditor.putString(ts, value);
prefEditor.apply();
final int MAX_CHAR = 128;
int maxLength = (value.length() < MAX_CHAR)?value.length():MAX_CHAR;
Log.i(EngagementShared.LOG_TAG, "received data push (" + ts + ") : " + value.substring(0,maxLength));
}
@Override
protected Boolean onDataPushStringReceived(Context context, String category, String body) {
String encodedCategory = encodeURIComponent(category);
String encodedBody = encodeURIComponent(body);
addDataPush(context.getApplicationContext(), encodedCategory, encodedBody, false);
EngagementShared.instance().checkDataPush();
return true;
}
@Override
protected Boolean onDataPushBase64Received(Context context, String category, byte[] decodedBody, String encodedBody) {
String encodedCategory = encodeURIComponent(category);
addDataPush(context.getApplicationContext(),encodedCategory,encodedBody,true);
EngagementShared.instance().checkDataPush();
return true;
}
}

Просмотреть файл

@ -0,0 +1,13 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
package com.microsoft.azure.engagement.shared;
import org.json.JSONObject;
public class EngagementDelegate {
public void onGetStatusResult(JSONObject _result) {};
public void didReceiveDataPush(JSONObject _data ) {};
}

Просмотреть файл

@ -0,0 +1,466 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
package com.microsoft.azure.engagement.shared;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import com.microsoft.azure.engagement.EngagementConfiguration;
import com.microsoft.azure.engagement.EngagementAgent;
public class EngagementShared {
public enum locationReportingType{
LOCATIONREPORTING_NONE(100),
LOCATIONREPORTING_LAZY(101),
LOCATIONREPORTING_REALTIME(102),
LOCATIONREPORTING_FINEREALTIME(103);
private int value;
private locationReportingType(int value) {
this.value = value;
}
public static locationReportingType fromInteger(int x) {
switch(x) {
case 100:
return LOCATIONREPORTING_NONE;
case 101:
return LOCATIONREPORTING_LAZY;
case 102:
return LOCATIONREPORTING_REALTIME;
case 103:
return LOCATIONREPORTING_FINEREALTIME;
}
return null;
}
} ;
public enum backgroundReportingType {
BACKGROUNDREPORTING_NONE(200),
BACKGROUNDREPORTING_FOREGROUND(201),
BACKGROUNDREPORTING_BACKGROUND(202);
private int value;
private backgroundReportingType(int value) {
this.value = value;
}
public static backgroundReportingType fromInteger(int x) {
switch(x) {
case 200:
return BACKGROUNDREPORTING_NONE;
case 201:
return BACKGROUNDREPORTING_FOREGROUND;
case 202:
return BACKGROUNDREPORTING_BACKGROUND;
}
return null;
}
} ;
public final static String LOG_TAG = "engagement-plugin";
public String pluginVersion = null;
public String nativeVersion;
public String pluginName ;
public boolean enablePluginLog = false;
public boolean isPaused = true;
private String previousActivityName = null;
public boolean readyForPush = false;
public EngagementDelegate delegate;
public Activity androidActivity;
// Singleton Pattern
private EngagementShared() {}
private static EngagementShared _instance = null;
public static EngagementShared instance()
{
if (_instance != null)
return _instance;
_instance = new EngagementShared();
return _instance;
}
public boolean alreadyInitialized()
{
return pluginVersion != null;
}
public void initSDK(String _pluginName, String _pluginVersion, String _nativeVersion )
{
pluginName = _pluginName;
pluginVersion = _pluginVersion ;
nativeVersion = _nativeVersion ;
if (enablePluginLog)
Log.d(LOG_TAG,"Plugin "+pluginName+" v"+_pluginVersion+" (nativeVersion "+_nativeVersion+")");
}
public void setPluginLog(boolean _enablePluginLog)
{
enablePluginLog = _enablePluginLog;
}
public void setEnabled(boolean _enabled) {
EngagementAgent.getInstance(androidActivity).setEnabled(_enabled);
}
public void setDelegate(EngagementDelegate _delegate)
{
delegate = _delegate;
}
public void logD(String _message)
{
if (enablePluginLog)
Log.d(LOG_TAG,_message);
}
public void logE(String _message)
{
Log.e(LOG_TAG,_message);
}
public void initialize(Activity _androidActivity,String _connectionString, locationReportingType _locationReporting, backgroundReportingType _background) {
androidActivity = _androidActivity;
logD("Initiliazing EngagementAgent");
EngagementConfiguration engagementConfiguration = new EngagementConfiguration();
engagementConfiguration.setConnectionString(_connectionString);
if (_locationReporting == locationReportingType.LOCATIONREPORTING_LAZY) {
engagementConfiguration.setLazyAreaLocationReport(true);
logD("Lazy Area Location enabled");
}
else
if (_locationReporting == locationReportingType.LOCATIONREPORTING_REALTIME) {
engagementConfiguration.setRealtimeLocationReport(true);
logD("Realtime Location enabled");
}
else
if (_locationReporting == locationReportingType.LOCATIONREPORTING_FINEREALTIME) {
engagementConfiguration.setRealtimeLocationReport(true);
engagementConfiguration.setFineRealtimeLocationReport(true);
logD("Fine Realtime Location enabled");
}
if (_background == backgroundReportingType.BACKGROUNDREPORTING_BACKGROUND) {
if (_locationReporting == locationReportingType.LOCATIONREPORTING_FINEREALTIME || _locationReporting == locationReportingType.LOCATIONREPORTING_REALTIME) {
engagementConfiguration.setBackgroundRealtimeLocationReport(true);
logD("Background Location enabled");
}
else
logE("Background mode requires realtime location");
}
else
if (_background == backgroundReportingType.BACKGROUNDREPORTING_FOREGROUND) {
if (_locationReporting == locationReportingType.LOCATIONREPORTING_NONE)
logE("Foreground mode requires location");
}
else {
if (_locationReporting != locationReportingType.LOCATIONREPORTING_NONE) {
logE("Foreground or Background required when using location");
}
}
EngagementAgent.getInstance(_androidActivity).init(engagementConfiguration);
Bundle b = new Bundle();
b.putString(pluginName, pluginVersion);
EngagementAgent.getInstance(androidActivity).sendAppInfo(b);
}
private Bundle stringToBundle(String _param) {
Bundle b = new Bundle();
if (_param == null || _param.equals("null") )
return b;
try {
JSONObject jObj = new JSONObject(_param);
@SuppressWarnings("unchecked")
Iterator<String> keys = jObj.keys();
while (keys.hasNext()) {
String key = keys.next();
String val = jObj.getString(key);
b.putString(key, val);
}
return b;
} catch (JSONException e) {
Log.e(LOG_TAG,"Failed to unserialize :"+_param+" => "+e.getMessage());
return null;
}
}
public void enableDataPush() {
readyForPush = true;
}
public void checkDataPush()
{
if (!readyForPush || isPaused) {
return;
}
Map<String,String> m = EngagementDataPushReceiver.getPendingDataPushes(androidActivity.getApplicationContext());
for (Map.Entry<String, ?> entry : m.entrySet())
{
String timestamp = entry.getKey();
logD("handling data push ("+timestamp+")");
String v = entry.getValue().toString();
JSONObject json = null;
try {
json = new JSONObject(v);
delegate.didReceiveDataPush(json);
} catch (JSONException e) {
logE("Failed to prepare data push " + e.getMessage());;
}
}
}
public void getStatus(EngagementDelegate _delegate) {
final EngagementDelegate delegate = _delegate ;
EngagementAgent.getInstance(androidActivity).getDeviceId(new EngagementAgent.Callback<String>() {
@Override
public void onResult(String deviceId) {
JSONObject json = new JSONObject();
try {
json.put("pluginVersion", pluginVersion);
json.put("nativeVersion",nativeVersion);
json.put("deviceId", deviceId);
json.put("isEnabled", EngagementAgent.getInstance(androidActivity).isEnabled());
logD("getStatus:"+json.toString());
delegate.onGetStatusResult(json);
} catch (JSONException e) {
logE("Failed to retrieve Status" + e.getMessage());
}
}
});
}
public void startActivity(String _activityName, String _extraInfos) {
logD("startActivity:"+_activityName+", w/"+_extraInfos);
Bundle extraInfos = stringToBundle(_extraInfos);
previousActivityName = _activityName;
EngagementAgent.getInstance(androidActivity).startActivity(androidActivity, _activityName, extraInfos);
}
public void endActivity() {
logD("endActivity");
EngagementAgent.getInstance(androidActivity).endActivity();
previousActivityName = null;
}
public void sendEvent(String _eventName, String _extraInfos) {
logD("sendEvent:"+_eventName+", w/"+_extraInfos);
Bundle extraInfos = stringToBundle(_extraInfos);
EngagementAgent.getInstance(androidActivity).sendEvent(_eventName, extraInfos);
}
public void sendSessionEvent(String _eventName, String _extraInfos) {
logD("sendSessionEvent:"+_eventName+", w/"+_extraInfos);
Bundle extraInfos = stringToBundle(_extraInfos);
EngagementAgent.getInstance(androidActivity).sendSessionEvent(_eventName, extraInfos);
}
public void startJob(String _jobName, String _extraInfos) {
logD("startJob:"+_jobName+", w/"+_extraInfos);
Bundle extraInfos = stringToBundle(_extraInfos);
EngagementAgent.getInstance(androidActivity).startJob(_jobName, extraInfos);
}
public void endJob(String _jobName) {
logD("endJob:"+_jobName);
EngagementAgent.getInstance(androidActivity).endJob(_jobName);
}
public void sendJobEvent(String _eventName, String _jobName, String _extraInfos) {
logD("sendJobEvent:"+_eventName+", in job:"+_jobName+" w/"+_extraInfos);
Bundle extraInfos = stringToBundle(_extraInfos);
EngagementAgent.getInstance(androidActivity).sendJobEvent(_eventName, _jobName, extraInfos);
}
public void sendError(String _errorName, String _extraInfos) {
logD("sendError:"+_errorName+", w/"+_extraInfos);
Bundle extraInfos = stringToBundle(_extraInfos);
EngagementAgent.getInstance(androidActivity).sendError(_errorName, extraInfos);
}
public void sendSessionError(String _errorName, String _extraInfos) {
logD("sendSessionError:"+_errorName+", w/"+_extraInfos);
Bundle extraInfos = stringToBundle(_extraInfos);
EngagementAgent.getInstance(androidActivity).sendSessionError(_errorName, extraInfos);
}
public void sendJobError(String _errorName, String _jobName, String _extraInfos) {
logD("sendJobError:"+_errorName+", in job:"+_jobName+" w/"+_extraInfos);
Bundle extraInfos = stringToBundle(_extraInfos);
EngagementAgent.getInstance(androidActivity).sendJobError(_errorName, _jobName, extraInfos);
}
public void sendAppInfo(String _extraInfos) {
logD("sendAppInfo:"+_extraInfos);
Bundle extraInfos = stringToBundle(_extraInfos);
EngagementAgent.getInstance(androidActivity).sendAppInfo(extraInfos);
}
public void onPause() {
logD("onPause: endActivity");
isPaused = true;
EngagementAgent.getInstance(androidActivity).endActivity();
}
public void onResume() {
if (previousActivityName != null) {
logD( "onResume: startActivity:"+previousActivityName);
EngagementAgent.getInstance(androidActivity).startActivity(androidActivity, previousActivityName, null);
}
else
{
logD("onResume (no previous activity)");
}
isPaused = false;
checkDataPush();
}
@TargetApi(Build.VERSION_CODES.M)
public JSONObject requestPermissions(JSONArray _permissions)
{
JSONObject ret = new JSONObject();
JSONObject p = new JSONObject();
String[] requestedPermissions = null;
try {
PackageInfo pi = androidActivity.getPackageManager().getPackageInfo(androidActivity.getPackageName(), PackageManager.GET_PERMISSIONS);
requestedPermissions = pi.requestedPermissions;
for(int i=0;i<requestedPermissions.length;i++)
Log.d(LOG_TAG,requestedPermissions[i]);
} catch (PackageManager.NameNotFoundException e) {
logE("Failed to load permissions, NameNotFound: " + e.getMessage());
}
logD("requestPermissions()");
int l = _permissions.length();
for(int i=0;i<l;i++)
{
try {
String permission = _permissions.getString(i);
String androidPermission = "android.permission."+permission;
int grant = androidActivity.checkCallingOrSelfPermission(androidPermission);
try {
p.put(permission,grant==PackageManager.PERMISSION_GRANTED);
} catch (JSONException e) {
logE("invalid permissions "+ e.getMessage());
}
if (grant != PackageManager.PERMISSION_GRANTED) {
if (!Arrays.asList(requestedPermissions).contains(androidPermission))
{
String errString = "requested permission "+androidPermission+" not set in Manifest";
Log.e(LOG_TAG,errString);
try {
ret.put("error", errString);
} catch (JSONException e) {
logE("invalid permissions "+ e.getMessage());
}
}
else
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Trying to request the permission if running on AndroidM
logD("requesting runtime permission " + androidPermission);
androidActivity.requestPermissions(new String[]{androidPermission}, 0);
}
}
else
logD(permission+" OK");
}catch (JSONException e) {
logE("invalid permissions "+ e.getMessage());
}
}
try {
ret.put("permissions", p);
} catch (JSONException e) {
logE("invalid permissions "+ e.getMessage());
}
return ret;
}
public void refreshPermissions()
{
logD("refreshPermissions()");
EngagementAgent.getInstance(androidActivity).refreshPermissions();
}
}

Просмотреть файл

@ -0,0 +1,216 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
package com.microsoft.azure.engagement.unity;
import android.app.Activity;
import android.net.Uri;
import android.util.Log;
import org.json.JSONObject;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import com.microsoft.azure.engagement.shared.EngagementShared;
import com.microsoft.azure.engagement.shared.EngagementDelegate;
import com.unity3d.player.UnityPlayer;
public class EngagementWrapper {
private static final String pluginName = "UNITY";
private static final String pluginVersion = "1.0.0";
private static final String nativeVersion = "4.1.3"; // to eventually retrieve from the SDK itself
private static final String unityMethod_onDataPushReceived = "onDataPushReceived";
private static final String unityMethod_onHandleUrl = "onHandleURL";
private static final String unityMethod_onStatusReceived= "onStatusReceived";
private static Activity androidActivity ;
private static String openURL;
private static String unityObjectName = null;
// Helper
private static void UnitySendMessage(String _method,String _message) {
if ( unityObjectName == null)
Log.e(EngagementShared.LOG_TAG, "Missing unityObjectMethod");
UnityPlayer.UnitySendMessage(unityObjectName, _method, _message);
}
private static EngagementDelegate engagementDelegate = new EngagementDelegate() {
@Override
public void didReceiveDataPush(JSONObject _data) {
UnitySendMessage(unityMethod_onDataPushReceived, _data.toString());
}
};
public static void handleOpenURL(String _url)
{
Log.i(EngagementShared.LOG_TAG, "handleOpenURL: " + _url);
openURL = _url;
}
public static void processOpenUrl()
{
if (openURL == null)
return ;
Log.i(EngagementShared.LOG_TAG,"onHandleOpenURL: "+openURL);
UnitySendMessage(unityMethod_onHandleUrl, openURL);
openURL = null;
}
// Unity Interface
public static void setAndroidActivity(Activity _androidActivity) {
androidActivity = _androidActivity;
Uri data = _androidActivity.getIntent().getData();
if (data != null) {
String lastUrl = data.toString();
handleOpenURL(lastUrl);
}
}
public static void registerApp( String _instanceName, String _connectionString,
int _locationType, int _locationMode, boolean _enablePluginLog)
{
unityObjectName = _instanceName;
if (androidActivity == null)
{
Log.e(EngagementShared.LOG_TAG,"missing AndroidActivty (setAndroidActivity() not being called?)");
return ;
}
if (EngagementShared.instance().alreadyInitialized())
{
Log.e(EngagementShared.LOG_TAG,"registerApp() already called");
return ;
}
try {
ApplicationInfo ai = androidActivity.getPackageManager().getApplicationInfo(androidActivity.getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
String mfPluginVersion = bundle.getString("engagement:unity:version");
if (mfPluginVersion == null)
throw new PackageManager.NameNotFoundException();
if (pluginVersion.equals(mfPluginVersion)==false)
Log.i(EngagementShared.LOG_TAG, "Unity Plugin Version (" + pluginVersion +") does not match manifest version ("+mfPluginVersion+") : Manifest might need to be regenerated");
}
catch ( Exception e) {
Log.e(EngagementShared.LOG_TAG, "Cannot find engagement:unity:version in Android Manifest : Manifest file needs to be generated through File/Engagement/Generate Android Manifest");
}
EngagementShared.instance().setPluginLog(_enablePluginLog);
EngagementShared.instance().initSDK(pluginName, pluginVersion, nativeVersion);
EngagementShared.instance().setDelegate(engagementDelegate);
EngagementShared.locationReportingType locationReporting = EngagementShared.locationReportingType.fromInteger(_locationType);
EngagementShared.backgroundReportingType background = EngagementShared.backgroundReportingType.fromInteger(_locationMode);
EngagementShared.instance().initialize(androidActivity, _connectionString, locationReporting, background);
// We consider the app to be active on registerApp as onResume() is not being automatically called
EngagementShared.instance().onResume();
}
public static void initializeReach() {
processOpenUrl();
EngagementShared.instance().enableDataPush();
}
public static void startActivity(String _activityName, String _extraInfos) {
EngagementShared.instance().startActivity(_activityName, _extraInfos);
}
public static void endActivity() {
EngagementShared.instance().endActivity();
}
public static void startJob(String _jobName, String _extraInfos) {
EngagementShared.instance().startJob(_jobName, _extraInfos);
}
public static void endJob(String _jobName) {
EngagementShared.instance().endJob(_jobName);
}
public static void sendEvent(String _eventName, String _extraInfos) {
EngagementShared.instance().sendEvent(_eventName, _extraInfos);
}
public static void sendAppInfo(String _extraInfos) {
EngagementShared.instance().sendAppInfo(_extraInfos);
}
public static void sendSessionEvent(String _eventName, String _extraInfos)
{
EngagementShared.instance().sendSessionEvent(_eventName, _extraInfos);
}
public static void sendJobEvent(String _eventName, String _jobName,String _extraInfos)
{
EngagementShared.instance().sendJobEvent(_eventName, _jobName, _extraInfos);
}
public static void sendError(String _errorName, String _extraInfos)
{
EngagementShared.instance().sendError(_errorName, _extraInfos);
}
public static void sendSessionError(String _errorName, String _extraInfos)
{
EngagementShared.instance().sendSessionError(_errorName, _extraInfos);
}
public static void sendJobError(String _errorName, String _jobName, String _extraInfos)
{
EngagementShared.instance().sendJobError(_errorName, _jobName, _extraInfos);
}
public static void getStatus() {
EngagementShared.instance().getStatus(new EngagementDelegate() {
@Override
public void onGetStatusResult(JSONObject _result) {
UnitySendMessage(unityMethod_onStatusReceived, _result.toString());
}
});
}
public static void setEnabled(boolean _enabled) {
EngagementShared.instance().setEnabled(_enabled);
}
public static void onApplicationPause(boolean _paused) {
final boolean paused = _paused;
// Check if there's an url to be processed
processOpenUrl();
// When clicking on a view, we may be called from another thread
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
public void run() {
if (paused) {
EngagementShared.instance().onPause();
} else {
EngagementShared.instance().onResume();
}
}
});
}
}

Просмотреть файл

@ -0,0 +1,57 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
package com.microsoft.azure.engagement.unity;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import com.microsoft.azure.engagement.shared.EngagementShared;
// To compensate for the lack of onNewIntent() on the UnityActivity
public class IntentCatcherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri data = getIntent().getData();
if (data != null) {
String url = data.toString();
Log.i(EngagementShared.LOG_TAG, "IntentCatcher handURL " + url);
EngagementWrapper.handleOpenURL(url);
}
// By default, the ActivityName is com.unity3d.player.UnityPlayerActivity, but this can be overriden in the manifest
Class<?> clazz = com.unity3d.player.UnityPlayerActivity.class;
try {
ApplicationInfo ai =getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
String activityName = bundle.getString("engagement:unity:activityname");
if (activityName==null)
Log.d(EngagementShared.LOG_TAG,"could not retrieve engagement:unity:activityname");
else
clazz = Class.forName(activityName);
} catch (Exception e) {
Log.e(EngagementShared.LOG_TAG,"Failed to find activityname: " + e.getMessage());
}
Log.i(EngagementShared.LOG_TAG,"Launching activity"+clazz.toString());
Intent gameIntent = new Intent(this, clazz);
startActivity(gameIntent);
// Close the IntentCatcherActivity
if (!isFinishing())
finish();
}
}

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.4 KiB

Просмотреть файл

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 1px * 2 lines at top -->
<item>
<shape android:shape="rectangle" >
<size android:height="1dip" />
<solid android:color="#b8b8b8" />
</shape>
</item>
<item android:top="1dip">
<shape android:shape="rectangle" >
<size android:height="1dip" />
<solid android:color="#a6a6a6" />
</shape>
</item>
<!-- a light grey gradient -->
<item android:top="2dip">
<shape android:shape="rectangle" >
<size android:height="29dip" />
<gradient
android:angle="-90"
android:endColor="#707070"
android:startColor="#989898" />
</shape>
</item>
<!-- a dark grey solid -->
<item android:top="31dip">
<shape android:shape="rectangle" >
<size android:height="30dip" />
<solid android:color="#22666666" />
</shape>
</item>
<!-- 2px bottom line at bottom -->
<item android:top="61dip">
<shape android:shape="rectangle" >
<size android:height="2dip" />
<solid android:color="#99343434" />
</shape>
</item>
</layer-list>

Просмотреть файл

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:id="@+id/engagement_button_bar"
style="@android:style/ButtonBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<View
android:layout_width="fill_parent"
android:layout_height="0sp"
android:layout_weight="7"
android:tag="spacer" />
<Button
android:id="@+id/exit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="4" />
<Button
android:id="@+id/action"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="4" />
<View
android:layout_width="fill_parent"
android:layout_height="0sp"
android:layout_weight="7"
android:tag="spacer" />
</LinearLayout>
</merge>

Просмотреть файл

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:autoLink="web|email|map"
android:background="@drawable/engagement_content_title"
android:ellipsize="end"
android:gravity="center"
android:maxLines="2"
android:paddingBottom="5dip"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@android:color/white"
android:textColorLink="@android:color/white"
android:textStyle="bold" />
</merge>

Просмотреть файл

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"/>

Просмотреть файл

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<RelativeLayout
android:id="@+id/engagement_notification_area"
android:layout_width="fill_parent"
android:layout_height="64dp"
android:layout_alignParentBottom="true"
android:background="#B000" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:orientation="horizontal" >
<ImageView
android:id="@+id/engagement_notification_icon"
android:layout_width="48dp"
android:layout_height="48dp" />
<LinearLayout
android:id="@+id/engagement_notification_text"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingLeft="5dip"
android:paddingRight="5dip" >
<TextView
android:id="@+id/engagement_notification_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@android:style/TextAppearance.Medium"
android:textStyle="bold" />
<TextView
android:id="@+id/engagement_notification_message"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textAppearance="@android:style/TextAppearance.Small" />
</LinearLayout>
<ImageView
android:id="@+id/engagement_notification_image"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:adjustViewBounds="true" />
<ImageButton
android:id="@+id/engagement_notification_close_area"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="#0F00"
android:src="@android:drawable/btn_dialog"
android:visibility="invisible" />
</LinearLayout>
<ImageButton
android:id="@+id/engagement_notification_close"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_marginRight="5dip"
android:background="#0F00"
android:src="@drawable/engagement_close" />
</RelativeLayout>
</merge>

Просмотреть файл

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/engagement_notification_overlay"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<include layout="@layout/engagement_notification_area" />
</RelativeLayout>

Просмотреть файл

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@android:color/white" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<include layout="@layout/engagement_content_title" />
<LinearLayout
android:id="@+id/questions"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dip" >
<TextView
android:id="@+id/body"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dip"
android:autoLink="web|email|map"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@android:color/black"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
</ScrollView>
<include layout="@layout/engagement_button_bar" />
</LinearLayout>

Просмотреть файл

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="45dip"
android:textColor="@android:color/black"/>

Просмотреть файл

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/question_title"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@android:color/black"
android:textStyle="italic" />
<RadioGroup
android:id="@+id/choices"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dip" />
</LinearLayout>

Просмотреть файл

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@android:color/white" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<include layout="@layout/engagement_content_title" />
<TextView
android:id="@+id/body"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:autoLink="web|email|map"
android:padding="10dip"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@android:color/black" />
</LinearLayout>
</ScrollView>
<include layout="@layout/engagement_button_bar" />
</LinearLayout>

Просмотреть файл

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="@android:color/white" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<include layout="@layout/engagement_content_title" />
<WebView
android:id="@+id/body"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dip" />
</LinearLayout>
</ScrollView>
<include layout="@layout/engagement_button_bar" />
</LinearLayout>

Просмотреть файл

@ -0,0 +1,3 @@
<resources>
<string name="app_name">LibAZMEUnity</string>
</resources>

Просмотреть файл

@ -0,0 +1 @@
include ':app', ':libEngagementUnity'

Просмотреть файл

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 10991c71f63854cca8b72f93ae9a36eb
folderAsset: yes
timeCreated: 1447678557
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,7 @@
Azure Mobile Engagement Android SDK
Copyright (c) Microsoft Corporation
All rights reserved.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Просмотреть файл

@ -0,0 +1,7 @@
Azure Mobile Engagement iOS SDK
Copyright (c) Microsoft Corporation
All rights reserved.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Просмотреть файл

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 8bb3252f7a72d43b094e1fb58c6b2e2d
folderAsset: yes
timeCreated: 1447740762
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,524 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
#if UNITY_EDITOR_OSX
#define ENABLE_IOS_SUPPORT
#endif
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using System.IO;
#if ENABLE_IOS_SUPPORT
using UnityEditor.iOS.Xcode;
#endif
using System.Xml;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using Ionic.Zip;
using System;
using Microsoft.Azure.Engagement.Unity;
#pragma warning disable 162,429
public class EngagementPostBuild {
public const string androidNS = "http://schemas.android.com/apk/res/android";
const string tagName = "Engagement";
static string[] GetScenePaths()
{
List<EditorBuildSettingsScene> scenes = new List<EditorBuildSettingsScene>(EditorBuildSettings.scenes);
List<string> enabledScenes = new List<string>();
foreach (EditorBuildSettingsScene scene in scenes)
{
if (scene.enabled)
enabledScenes.Add(scene.path);
}
return enabledScenes.ToArray();
}
[MenuItem("File/Engagement/Generate Android Manifest")]
static void GenerateManifest ()
{
EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.Android);
string path = Application.temporaryCachePath + "/EngagementManifest";
if (Directory.Exists(path))
Directory.Delete (path,true);
BuildPipeline.BuildPlayer(GetScenePaths(), path,BuildTarget.Android,BuildOptions.AcceptExternalModificationsToPlayer);
}
public static void addMetaData(XmlDocument doc, XmlNode node, XmlNamespaceManager namespaceManager,string name, string value)
{
XmlNode metaData = doc.CreateNode (XmlNodeType.Element, "meta-data", null);
metaData.Attributes.Append (doc.CreateAttribute ("tag")).Value = tagName;
metaData.Attributes.Append (doc.CreateAttribute ("android", "name", EngagementPostBuild.androidNS)).Value = name;
metaData.Attributes.Append (doc.CreateAttribute ("android", "value", EngagementPostBuild.androidNS)).Value = value;
node.AppendChild (metaData);
}
public static void addUsesPermission(XmlDocument doc, XmlNode node, XmlNamespaceManager namespaceManager,string permissionName)
{
XmlNode usesPermission = doc.CreateNode(XmlNodeType.Element, "uses-permission", null);
usesPermission.Attributes.Append (doc.CreateAttribute ("tag")).Value = tagName;
usesPermission.Attributes.Append (doc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = permissionName;
node.AppendChild (usesPermission);
}
public static void addActivity(XmlDocument doc, XmlNode node, XmlNamespaceManager namespaceManager,string activityName, string actionName, string theme,string mimeType)
{
XmlNode engagementTextAnnouncementActivity = doc.CreateNode (XmlNodeType.Element, "activity", null);
engagementTextAnnouncementActivity.Attributes.Append (doc.CreateAttribute ("tag")).Value = tagName;
engagementTextAnnouncementActivity.Attributes.Append (doc.CreateAttribute ("android", "theme", EngagementPostBuild.androidNS)).Value = "@android:style/Theme."+theme;
engagementTextAnnouncementActivity.Attributes.Append (doc.CreateAttribute ("android", "name", EngagementPostBuild.androidNS)).Value = "com.microsoft.azure.engagement.reach.activity."+activityName;
XmlNode engagementTextAnnouncementIntent = doc.CreateNode (XmlNodeType.Element, "intent-filter", null);
engagementTextAnnouncementIntent.Attributes.Append (doc.CreateAttribute ("tag")).Value = tagName;
engagementTextAnnouncementIntent.AppendChild (doc.CreateNode (XmlNodeType.Element, "action", null))
.Attributes.Append (doc.CreateAttribute ("android", "name", EngagementPostBuild.androidNS)).Value = "com.microsoft.azure.engagement.reach.intent.action."+actionName;
engagementTextAnnouncementIntent.AppendChild (doc.CreateNode (XmlNodeType.Element, "category", null))
.Attributes.Append (doc.CreateAttribute ("android", "name", EngagementPostBuild.androidNS)).Value = "android.intent.category.DEFAULT";
if (mimeType != null) {
engagementTextAnnouncementIntent.AppendChild (doc.CreateNode (XmlNodeType.Element, "data", null))
.Attributes.Append (doc.CreateAttribute ("android", "mimeType", EngagementPostBuild.androidNS)).Value = mimeType;
}
engagementTextAnnouncementActivity.AppendChild (engagementTextAnnouncementIntent);
node.AppendChild (engagementTextAnnouncementActivity);
}
public static void addReceiver(XmlDocument doc, XmlNode node, XmlNamespaceManager namespaceManager,string receiverName, string[] actions)
{
XmlNode receiver = doc.CreateNode (XmlNodeType.Element, "receiver", null);
receiver.Attributes.Append (doc.CreateAttribute ("tag")).Value = tagName;
receiver.Attributes.Append (doc.CreateAttribute ("android", "exported", EngagementPostBuild.androidNS)).Value = "false";
receiver.Attributes.Append (doc.CreateAttribute ("android", "name", EngagementPostBuild.androidNS)).Value = "com.microsoft.azure.engagement." + receiverName;
XmlNode receiverIntent = doc.CreateNode (XmlNodeType.Element, "intent-filter", null);
foreach (string action in actions) {
XmlNode actionNode = doc.CreateNode (XmlNodeType.Element, "action", null);
actionNode.Attributes.Append (doc.CreateAttribute ("android", "name", EngagementPostBuild.androidNS)).Value = action;
receiverIntent.AppendChild (actionNode);
}
receiver.AppendChild (receiverIntent);
node.AppendChild (receiver);
}
public static int generateAndroidChecksum()
{
string chk = EngagementConfiguration.ANDROID_CONNECTION_STRING
+ EngagementConfiguration.ANDROID_GOOGLE_PROJECT_NUMBER
+ EngagementConfiguration.ANDROID_REACH_ICON
+ EngagementConfiguration.ACTION_URL_SCHEME
+ EngagementConfiguration.ANDROID_UNITY3D_ACTIVITY
+ EngagementConfiguration.ENABLE_NATIVE_LOG
+ EngagementConfiguration.ENABLE_PLUGIN_LOG
+ EngagementConfiguration.ENABLE_REACH
+ EngagementConfiguration.LOCATION_REPORTING_MODE
+ EngagementConfiguration.LOCATION_REPORTING_TYPE
+ EngagementAgent.PLUGIN_VERSION;
return Animator.StringToHash (chk);
}
[PostProcessBuildAttribute(1)]
public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
if (target == BuildTarget.iOS) {
#if ENABLE_IOS_SUPPORT
string bundleId = PlayerSettings.bundleIdentifier ;
// 0 - Configuration Check
string connectionString = EngagementConfiguration.IOS_CONNECTION_STRING;
if (string.IsNullOrEmpty(connectionString))
throw new ArgumentException("IOS_CONNECTION_STRING cannot be null when building on iOS project");
string projectFile = PBXProject.GetPBXProjectPath(pathToBuiltProject);
// 1 - Update Project
PBXProject pbx = new PBXProject();
pbx.ReadFromFile(projectFile);
string targetUID = pbx.TargetGuidByName(PBXProject.GetUnityTargetName() /*"Unity-iPhone"*/);
string CTFramework = "CoreTelephony.framework";
Debug.Log("Adding "+ CTFramework + " to XCode Project");
pbx.AddFrameworkToProject(targetUID,CTFramework,true);
const string disableAll = "ENGAGEMENT_UNITY=1,ENGAGEMENT_DISABLE_IDFA=1";
const string enableIDFA = "ENGAGEMENT_UNITY=1,ENGAGEMENT_DISABLE_IDFA=1";
const string disableIDFA = "ENGAGEMENT_UNITY=1";
if (EngagementConfiguration.IOS_DISABLE_IDFA == true)
pbx.UpdateBuildProperty(targetUID,"GCC_PREPROCESSOR_DEFINITIONS",enableIDFA.Split(','),disableAll.Split(','));
else
pbx.UpdateBuildProperty(targetUID,"GCC_PREPROCESSOR_DEFINITIONS",disableIDFA.Split(','),disableAll.Split(','));
string[] paths = new string[] {
EngagementConfiguration.IOS_REACH_ICON,
"EngagementPlugin/iOS/res/close.png"
};
// 3 - Add files to project
foreach(string path in paths)
{
if (string.IsNullOrEmpty(path))
continue ;
string fullpath = Application.dataPath+"/"+path;
string file = Path.GetFileName (fullpath);
string fileUID = pbx.AddFile(file,file);
Debug.Log("Adding "+ file + " to XCode Project");
pbx.AddFileToBuild(targetUID,fileUID);
string xcodePath = pathToBuiltProject+"/"+file ;
if (File.Exists(xcodePath) == false)
{
Debug.Log("Copy from "+ fullpath + " to "+xcodePath);
File.Copy (fullpath, xcodePath);
}
}
pbx.WriteToFile(projectFile);
// 4 - Modify .PLIST
string plistPath = pathToBuiltProject + "/Info.plist";
PlistDocument plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(plistPath));
// Get root
PlistElementDict rootDict = plist.root;
if (EngagementConfiguration.ENABLE_REACH == true) {
PlistElementArray UIBackgroundModes = rootDict.CreateArray ("UIBackgroundModes");
UIBackgroundModes.AddString ("remote-notification");
PlistElementArray CFBundleURLTypes = rootDict.CreateArray("CFBundleURLTypes");
PlistElementDict dict = CFBundleURLTypes.AddDict();
dict.SetString("CFBundleTypeRole","None");
dict.SetString("CFBundleURLName",bundleId+".redirect");
PlistElementArray schemes = dict.CreateArray("CFBundleURLSchemes");
schemes.AddString(EngagementConfiguration.ACTION_URL_SCHEME);
}
// Required on iOS8
string reportingDesc = EngagementConfiguration.LOCATION_REPORTING_DESCRIPTION;
if (reportingDesc == null)
reportingDesc = PlayerSettings.productName + " reports your location for analytics purposes";
if (EngagementConfiguration.LOCATION_REPORTING_MODE == LocationReportingMode.BACKGROUND)
{
rootDict.SetString("NSLocationAlwaysUsageDescription",reportingDesc);
}
else
if (EngagementConfiguration.LOCATION_REPORTING_MODE == LocationReportingMode.FOREGROUND)
{
rootDict.SetString("NSLocationWhenInUseUsageDescription",reportingDesc);
}
string icon = EngagementConfiguration.IOS_REACH_ICON;
PlistElementDict engagementDict = rootDict.CreateDict("Engagement");
engagementDict.SetString("IOS_CONNECTION_STRING",EngagementConfiguration.IOS_CONNECTION_STRING);
engagementDict.SetString("IOS_REACH_ICON",icon);
engagementDict.SetBoolean("ENABLE_NATIVE_LOG",EngagementConfiguration.ENABLE_NATIVE_LOG);
engagementDict.SetBoolean("ENABLE_PLUGIN_LOG",EngagementConfiguration.ENABLE_PLUGIN_LOG);
engagementDict.SetBoolean("ENABLE_REACH",EngagementConfiguration.ENABLE_REACH);
engagementDict.SetInteger("LOCATION_REPORTING_MODE",Convert.ToInt32(EngagementConfiguration.LOCATION_REPORTING_MODE));
engagementDict.SetInteger("LOCATION_REPORTING_TYPE",Convert.ToInt32(EngagementConfiguration.LOCATION_REPORTING_TYPE));
// Write to file
File.WriteAllText(plistPath, plist.WriteToString());
#else
Debug.LogError("You need to active ENABLE_IOS_SUPPORT to build for IOS");
#endif
}
if (target == BuildTarget.Android)
{
string bundleId = PlayerSettings.bundleIdentifier ;
string productName = PlayerSettings.productName ;
int chk = generateAndroidChecksum ();
// 0 - Configuration check
string connectionString = EngagementConfiguration.ANDROID_CONNECTION_STRING;
if (string.IsNullOrEmpty(connectionString))
throw new ArgumentException("ANDROID_CONNECTION_STRING cannot be null when building on Android project");
if (EngagementConfiguration.ENABLE_REACH == true )
{
string projectNumber = EngagementConfiguration.ANDROID_GOOGLE_PROJECT_NUMBER;
if (string.IsNullOrEmpty(projectNumber))
throw new ArgumentException("ANDROID_GOOGLE_PROJECT_NUMBER cannot be null when Reach is enabled");
}
string manifestPath = pathToBuiltProject+"/"+productName+"/AndroidManifest.xml";
string androidPath = Application.dataPath+"/Plugins/Android";
string mfFilepath = androidPath+"/AndroidManifest.xml";
XmlNode root ;
XmlNodeList nodes ;
XmlDocument xmlDoc ;
XmlTextReader reader;
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("android", EngagementPostBuild.androidNS);
// Test Export vs Build
if (File.Exists(manifestPath) == false)
{
// Check that Manifest exists
if (File.Exists(mfFilepath) == false)
{
Debug.LogError ("Missing AndroidManifest.xml in Plugins/Android : execute 'File/Engagement/Generate Android Manifest'");
return ;
}
// Check that it contains Engagement tags
xmlDoc = new XmlDocument ();
xmlDoc.XmlResolver = null;
// Create the reader.
reader = new XmlTextReader (mfFilepath);
xmlDoc.Load(reader);
reader.Close ();
root = xmlDoc.DocumentElement;
nodes = root.SelectNodes("//*[@tag='"+tagName+"']",namespaceManager);
if (nodes.Count == 0)
Debug.LogError ("Android manifest in Plugins/Android does not contain Engagement extensions : execute 'File/Engagement/Generate Android Manifest'" );
// Checking the version
XmlNode versionNode = root.SelectSingleNode("/manifest/application/meta-data[@android:name='engagement:unity:version']",namespaceManager);
if (versionNode != null) {
string ver = versionNode.Attributes["android:value"].Value;
if (ver != EngagementAgent.PLUGIN_VERSION.ToString())
versionNode = null;
}
if (versionNode == null)
Debug.LogError ("EngagementPlugin has been updated : you need to execute 'File/Engagement/Generate Android Manifest' to update your application Manifest first" );
// Checking the checksum
XmlNode chkNode = root.SelectSingleNode("/manifest/application/meta-data[@android:name='engagement:unity:checksum']",namespaceManager);
if (chkNode != null) {
string mfchk = chkNode.Attributes["android:value"].Value;
if (mfchk != chk.ToString())
chkNode = null;
}
if (chkNode == null)
Debug.LogError ("Configuration file has changed : you need to execute 'File/Engagement/Generate Android Manifest' to update your application Manifest" );
// Manifest already processed : nothing to do
return ;
}
Directory.CreateDirectory (androidPath);
xmlDoc = new XmlDocument ();
xmlDoc.XmlResolver = null;
reader = new XmlTextReader (manifestPath);
xmlDoc.Load(reader);
reader.Close ();
root = xmlDoc.DocumentElement;
// Delete all the former tags
nodes = root.SelectNodes("//*[@tag='"+tagName+"']",namespaceManager);
foreach(XmlNode node in nodes)
node.ParentNode.RemoveChild(node);
XmlNode manifestNode = root.SelectSingleNode ("/manifest",namespaceManager);
XmlNode applicationNode = root.SelectSingleNode ("/manifest/application",namespaceManager);
XmlNode activityNode = root.SelectSingleNode ("/manifest/application/activity[@android:label='@string/app_name']",namespaceManager);
string activity = EngagementConfiguration.ANDROID_UNITY3D_ACTIVITY;
if (activity == null || activity == "")
activity = "com.unity3d.player.UnityPlayerActivity";
// Already in the Unity Default Manifest
// EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,"android.permission.INTERNET");
EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,"android.permission.ACCESS_NETWORK_STATE");
EngagementPostBuild.addMetaData(xmlDoc,applicationNode,namespaceManager,"engagement:log:test",XmlConvert.ToString(EngagementConfiguration.ENABLE_NATIVE_LOG));
EngagementPostBuild.addMetaData(xmlDoc,applicationNode,namespaceManager,"engagement:unity:version",EngagementAgent.PLUGIN_VERSION);
EngagementPostBuild.addMetaData(xmlDoc,applicationNode,namespaceManager,"engagement:unity:checksum",chk.ToString());
XmlNode service = xmlDoc.CreateNode(XmlNodeType.Element, "service", null);
service.Attributes.Append (xmlDoc.CreateAttribute ("tag")).Value = tagName;
service.Attributes.Append (xmlDoc.CreateAttribute ("android","exported",EngagementPostBuild.androidNS)).Value = "false";
service.Attributes.Append (xmlDoc.CreateAttribute ("android", "label", EngagementPostBuild.androidNS)).Value = productName + "Service";
service.Attributes.Append (xmlDoc.CreateAttribute ("android", "name", EngagementPostBuild.androidNS)).Value ="com.microsoft.azure.engagement.service.EngagementService";
service.Attributes.Append (xmlDoc.CreateAttribute ("android", "process", EngagementPostBuild.androidNS)).Value =":Engagement";
applicationNode.AppendChild (service);
string targetAARPath = Application.dataPath+"/Plugins/Android/engagement_notification_icon.aar";
File.Delete(targetAARPath);
if (EngagementConfiguration.ENABLE_REACH == true )
{
EngagementPostBuild.addActivity(xmlDoc,applicationNode,namespaceManager,"EngagementWebAnnouncementActivity","ANNOUNCEMENT","Light","text/html");
EngagementPostBuild.addActivity(xmlDoc,applicationNode,namespaceManager,"EngagementTextAnnouncementActivity","ANNOUNCEMENT","Light","text/plain");
EngagementPostBuild.addActivity(xmlDoc,applicationNode,namespaceManager,"EngagementPollActivity","POLL","Light",null);
EngagementPostBuild.addActivity(xmlDoc,applicationNode,namespaceManager,"EngagementLoadingActivity","LOADING","Dialog",null);
const string reachActions = "android.intent.action.BOOT_COMPLETED," +
"com.microsoft.azure.engagement.intent.action.AGENT_CREATED," +
"com.microsoft.azure.engagement.intent.action.MESSAGE," +
"com.microsoft.azure.engagement.reach.intent.action.ACTION_NOTIFICATION," +
"com.microsoft.azure.engagement.reach.intent.action.EXIT_NOTIFICATION," +
"com.microsoft.azure.engagement.reach.intent.action.DOWNLOAD_TIMEOUT";
EngagementPostBuild.addReceiver(xmlDoc,applicationNode,namespaceManager,"reach.EngagementReachReceiver",reachActions.Split(','));
const string downloadActions = "android.intent.action.DOWNLOAD_COMPLETE" ;
EngagementPostBuild.addReceiver(xmlDoc,applicationNode,namespaceManager,"reach.EngagementReachDownloadReceiver",downloadActions.Split(','));
// Add GCM Support
if (string.IsNullOrEmpty(EngagementConfiguration.ANDROID_GOOGLE_PROJECT_NUMBER)==false)
{
EngagementPostBuild.addMetaData(xmlDoc,applicationNode,namespaceManager,"engagement:gcm:sender",EngagementConfiguration.ANDROID_GOOGLE_PROJECT_NUMBER+"\\n");
const string gcmActions = "com.microsoft.azure.engagement.intent.action.APPID_GOT" ;
EngagementPostBuild.addReceiver(xmlDoc,applicationNode,namespaceManager,"gcm.EngagementGCMEnabler",gcmActions.Split(','));
XmlNode receiver = xmlDoc.CreateNode(XmlNodeType.Element, "receiver", null);
receiver.Attributes.Append (xmlDoc.CreateAttribute ("tag")).Value = tagName;
receiver.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = "com.microsoft.azure.engagement.gcm.EngagementGCMReceiver";
receiver.Attributes.Append (xmlDoc.CreateAttribute ("android", "permission", EngagementPostBuild.androidNS)).Value = "com.google.android.c2dm.permission.SEND";
XmlNode intentReceiver = xmlDoc.CreateNode(XmlNodeType.Element, "intent-filter", null);
receiver.AppendChild(intentReceiver);
intentReceiver.AppendChild ( xmlDoc.CreateNode (XmlNodeType.Element, "action", null) )
.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = "com.google.android.c2dm.intent.REGISTRATION";
intentReceiver.AppendChild ( xmlDoc.CreateNode (XmlNodeType.Element, "action", null) )
.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = "com.google.android.c2dm.intent.RECEIVE";
intentReceiver.AppendChild ( xmlDoc.CreateNode (XmlNodeType.Element, "category", null) )
.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = bundleId;
applicationNode.AppendChild (receiver);
string permissionPackage = bundleId + ".permission.C2D_MESSAGE";
EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,permissionPackage);
XmlNode permission = xmlDoc.CreateNode(XmlNodeType.Element, "permission", null);
permission.Attributes.Append (xmlDoc.CreateAttribute ("tag")).Value = tagName;
permission.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = permissionPackage;
permission.Attributes.Append (xmlDoc.CreateAttribute ("android", "protectionLevel", EngagementPostBuild.androidNS)).Value = "signature";
manifestNode.AppendChild (permission);
}
const string datapushActions = "com.microsoft.azure.engagement.reach.intent.action.DATA_PUSH" ;
EngagementPostBuild.addReceiver(xmlDoc,applicationNode,namespaceManager,"shared.EngagementDataPushReceiver",datapushActions.Split(','));
EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,"android.permission.WRITE_EXTERNAL_STORAGE");
EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,"android.permission.DOWNLOAD_WITHOUT_NOTIFICATION");
EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,"android.permission.VIBRATE");
EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,"com.google.android.c2dm.permission.RECEIVE");
string icon = "app_icon"; // using Application icon as default
if (string.IsNullOrEmpty(EngagementConfiguration.ANDROID_REACH_ICON ) == false)
{
// The only way to add resources to the APK is through a AAR library : let just create one with the icon
icon = "engagement_notification_icon";
string srcAARPath = Application.dataPath+"/EngagementPlugin/Editor/engagement_notification_icon.zip";
string iconPath = Application.dataPath+"/"+EngagementConfiguration.ANDROID_REACH_ICON;
File.Copy (srcAARPath,targetAARPath, true );
ZipFile zip = ZipFile.Read(targetAARPath);
zip.AddFile (iconPath).FileName = "res/drawable/"+icon+".png";
zip.Save ();
}
EngagementPostBuild.addMetaData(xmlDoc,applicationNode,namespaceManager,"engagement:reach:notification:icon",icon);
XmlNode catcherActivity = xmlDoc.CreateNode(XmlNodeType.Element, "activity", null);
catcherActivity.Attributes.Append (xmlDoc.CreateAttribute ("tag")).Value = "Engagement";
catcherActivity.Attributes.Append (xmlDoc.CreateAttribute ("android","label",EngagementPostBuild.androidNS)).Value = "@string/app_name";
catcherActivity.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = "com.microsoft.azure.engagement.unity.IntentCatcherActivity";
XmlNode intent = xmlDoc.CreateNode(XmlNodeType.Element, "intent-filter", null);
intent.Attributes.Append (xmlDoc.CreateAttribute ("tag")).Value = tagName;
intent.AppendChild ( xmlDoc.CreateNode (XmlNodeType.Element, "action", null) )
.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = "android.intent.action.VIEW";
intent.AppendChild ( xmlDoc.CreateNode (XmlNodeType.Element, "category", null) )
.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = "android.intent.category.DEFAULT";
intent.AppendChild ( xmlDoc.CreateNode (XmlNodeType.Element, "category", null) )
.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = "android.intent.category.BROWSABLE";
intent.AppendChild ( xmlDoc.CreateNode (XmlNodeType.Element, "data", null) )
.Attributes.Append (xmlDoc.CreateAttribute ("android","scheme",EngagementPostBuild.androidNS)).Value = EngagementConfiguration.ACTION_URL_SCHEME;
catcherActivity.AppendChild(intent);
applicationNode.AppendChild (catcherActivity);
EngagementPostBuild.addMetaData(xmlDoc,applicationNode,namespaceManager,"engagement:unity:activityname",activity);
}
if (EngagementConfiguration.LOCATION_REPORTING_MODE == LocationReportingMode.BACKGROUND)
{
string bootReceiverActions = "android.intent.action.BOOT_COMPLETED";
EngagementPostBuild.addReceiver(xmlDoc, applicationNode, namespaceManager,"EngagementLocationBootReceiver", bootReceiverActions.Split(','));
}
if (EngagementConfiguration.LOCATION_REPORTING_TYPE == LocationReportingType.LAZY || EngagementConfiguration.LOCATION_REPORTING_TYPE == LocationReportingType.REALTIME)
EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,"android.permission.ACCESS_COARSE_LOCATION");
else
if (EngagementConfiguration.LOCATION_REPORTING_TYPE == LocationReportingType.FINEREALTIME )
EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,"android.permission.ACCESS_FINE_LOCATION");
if (EngagementConfiguration.LOCATION_REPORTING_MODE == LocationReportingMode.BACKGROUND || EngagementConfiguration.ENABLE_REACH == true)
EngagementPostBuild.addUsesPermission(xmlDoc,manifestNode,namespaceManager,"android.permission.RECEIVE_BOOT_COMPLETED");
// Update the manifest
TextWriter textWriter = new StreamWriter (manifestPath );
xmlDoc.Save (textWriter);
textWriter.Close ();
// revert the bundle id
activityNode.Attributes.Append (xmlDoc.CreateAttribute ("android","name",EngagementPostBuild.androidNS)).Value = activity;
Debug.Log ("Generating :"+mfFilepath);
TextWriter mfWriter = new StreamWriter (mfFilepath );
xmlDoc.Save (mfWriter);
mfWriter.Close ();
}
}
}
#pragma warning restore 162,429

Просмотреть файл

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 91901459b9eb6409c919beae6fffa989
timeCreated: 1450518446
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Двоичные данные
src/EngagementPlugin/Editor/Ionic.Zip.dll Executable file

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,20 @@
fileFormatVersion: 2
guid: c7684861381ae4b3aa50f0ba960c66f3
timeCreated: 1449757491
licenseType: Free
PluginImporter:
serializedVersion: 1
iconMap: {}
executionOrder: {}
isPreloaded: 0
platformData:
Any:
enabled: 0
settings: {}
Editor:
enabled: 1
settings:
DefaultValueInitialized: true
userData:
assetBundleName:
assetBundleVariant:

Двоичные данные
src/EngagementPlugin/Editor/engagement_notification_icon.zip Normal file

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8ef693fca247b46369ecded71e0528b2
timeCreated: 1450536409
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,92 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
namespace Microsoft.Azure.Engagement.Unity
{
/// <summary>
/// Engagement configuration.
/// </summary>
/// <remarks>
/// Every time this class is being modified, the File/Engagement/Generate Android Manifest must be executed.
/// </remarks>
public static class EngagementConfiguration
{
/// <summary>
/// (Required) Your iOS Engagement application connection string.
/// </summary>
public const string IOS_CONNECTION_STRING = null;
/// <summary>
/// (Required) Your Android Engagement application connection string.
/// </summary>
public const string ANDROID_CONNECTION_STRING = null;
/// <summary>
/// Enable\Disable console logs on native SDKs.
/// </summary>
public const bool ENABLE_NATIVE_LOG = true;
/// <summary>
/// Enable\Disable console logs on the Unity plugin.
/// </summary>
public const bool ENABLE_PLUGIN_LOG = true;
/// <summary>
/// Enable\Disable the use of the IDFA to compute the device id.
/// </summary>
/// <remarks>
/// If you are enabling the IDFA in the SDK but you are not using advertising elsewhere in the application,
/// you might be rejected by the App Store review process. In this case you should keep this configuration to false.
/// </remarks>
public const bool IOS_DISABLE_IDFA = false;
/// <summary>
/// If you customized the Unity3D Android activity then provide your customized activity here.
/// </summary>
public const string ANDROID_UNITY3D_ACTIVITY = null;
/// <summary>
/// Define the location reporting type thanks to <see cref="LocationReportingType"/> enumeration.
/// </summary>
public const LocationReportingType LOCATION_REPORTING_TYPE = LocationReportingType.NONE;
/// <summary>
/// Define the location reporting mode thanks to <see cref="LocationReportingMode"/> enumeration.
/// </summary>
public const LocationReportingMode LOCATION_REPORTING_MODE = LocationReportingMode.NONE;
/// <summary>
/// (Required if location enabled for iOS) Starting with iOS 8, you must provide a description for how your application uses location services.
/// </summary>
public const string LOCATION_REPORTING_DESCRIPTION = null ;
/// <summary>
/// Enable\Disable the Reach feature of the SDK.
/// </summary>
public const bool ENABLE_REACH = true;
/// <summary>
/// Define a URL scheme used by action urls from Reach campaigns.
/// </summary>
public const string ACTION_URL_SCHEME = null;
/// <summary>
/// An icon file's path relative to the Assets/ directory if you want to use another one than the default iOS application icon.
/// </summary>
public const string IOS_REACH_ICON = null;
/// <summary>
/// An icon file's path relative to the Assets/ directory if you want to use another one than the default Android application icon.
/// </summary>
public const string ANDROID_REACH_ICON = null;
/// <summary>
/// (Required if Reach feature is enabled) Your Android Google project number to enable native push in the application.
/// </summary>
public const string ANDROID_GOOGLE_PROJECT_NUMBER = null;
}
}

Просмотреть файл

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: b893f2bb2c8904a328600cca9ac3f1bd
timeCreated: 1451413795
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,831 @@
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff39\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}
{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Bookshelf Symbol 3};}
{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};}
{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????????\'a1\'a7??????};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};}
{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Tahoma{\*\falt ?? ??};}{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 00000000000000000000}@MS Mincho{\*\falt @MS Gothic};}
{\f41\fbidi \fnil\fcharset134\fprq2{\*\panose 00000000000000000000}@SimSun{\*\falt Minion Web};}{\f42\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Trebuchet MS{\*\falt Univers};}
{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????????\'a1\'a7??????};}
{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}
{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????????\'a1\'a7??????};}
{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f44\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}
{\f45\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f47\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f48\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}
{\f49\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f50\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f51\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}
{\f52\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f64\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f65\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};}
{\f67\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f68\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f69\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};}
{\f70\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f71\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f72\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};}
{\f156\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f154\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f155\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}
{\f157\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f158\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f161\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}
{\f176\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????????\'a1\'a7??????};}{\f384\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}{\f385\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};}
{\f387\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f388\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}{\f391\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};}
{\f392\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};}{\f434\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?? ??};}{\f435\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?? ??};}
{\f437\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?? ??};}{\f438\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?? ??};}{\f439\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?? ??};}
{\f440\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?? ??};}{\f441\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?? ??};}{\f442\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?? ??};}
{\f443\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?? ??};}{\f446\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f444\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}
{\f445\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};}{\f447\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f448\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}
{\f451\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};}{\f456\fbidi \fnil\fcharset0\fprq2 @SimSun Western{\*\falt Minion Web};}{\f464\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}
{\f465\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};}{\f467\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};}{\f468\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}
{\f471\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}
{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}
{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}
{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}
{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????????\'a1\'a7??????};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}
{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}
{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}
{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}
{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}
{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}
{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}
{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}
{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}
{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}
{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????????\'a1\'a7??????};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}
{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}
{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;
\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;
\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0
\b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar
\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar
\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar
\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar
\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\*
\cs15 \additive \rtlch\fcs1 \ab\af39\afs19 \ltrch\fcs0 \b\f39\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af39\afs19 \ltrch\fcs0 \b\f39\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive
\rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af39\afs19
\ltrch\fcs0 \f39\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19
\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink9 \slocked
Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1
\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{
\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1
\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{
\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1
\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{
\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0
\rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{
\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0
\rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar
\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{
\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0
\rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{
\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs28\alang1025 \ltrch\fcs0
\b\fs28\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
\ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20
\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{
\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0
\b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink107 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50
Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1
\af39\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{
\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink54 \slocked \ssemihidden
Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af39\afs19\alang1025 \ltrch\fcs0
\i\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\*
\cs58 \additive \rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60
\additive \rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
\rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{
\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f39\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super
\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f39\fs20 \sbasedon10 \slink65 \slocked \ssemihidden
Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025
\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \f39\fs20
\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{
\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
\af39\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af39\afs16 \ltrch\fcs0 \f39\fs16
\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af42 \ltrch\fcs0 \b\f42\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10
page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025
\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink109 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025
\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
\af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink81 \slocked
Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{
\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\f39\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af39\afs19
\ltrch\fcs0 \f39\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs20\alang1025 \ltrch\fcs0
\fs18\lang1033\langfe1033\loch\f42\hich\af42\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af39\afs24\alang1025 \ltrch\fcs0 \b\f42\fs24\lang1033\langfe1033\langnp1033\langfenp1033
\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\ul\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0
Heading French Warranty;}{\*\cs94 \additive \f39\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive
\f2\cf15\lang1024\langfe1024\noproof tw4winExternal;}{\*\cs96 \additive \v\f2\fs24\cf12\sub tw4winMark;}{\*\cs97 \additive \b\f39 Preamble Char;}{\*\cs98 \additive \f2\fs40\cf4 tw4winError;}{\*\cs99 \additive \cf2 tw4winTerm;}{\*\cs100 \additive
\f2\cf11\lang1024\langfe1024\noproof tw4winPopup;}{\*\cs101 \additive \f2\cf10\lang1024\langfe1024\noproof tw4winJump;}{\*\cs102 \additive \f2\cf6\lang1024\langfe1024\noproof tw4winInternal;}{\*\cs103 \additive \f2\cf13\lang1024\langfe1024\noproof
DO_NOT_TRANSLATE;}{\s104\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext104 \slink105 Body Text 2;}{\*\cs105 \additive \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f39\fs19 \sbasedon10 \slink104 \slocked Body Text 2 Char;}{
\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink108 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab\af39\afs19 \ltrch\fcs0 \b\f39\fs19
\sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs108 \additive \rtlch\fcs1 \ab0\af39\afs19 \ltrch\fcs0 \b0\f39\fs19 \sbasedon107 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs109 \additive \rtlch\fcs1
\ab\af39\afs19 \ltrch\fcs0 \b\f39\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{\s110\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs20\alang1025 \ltrch\fcs0
\b\fs20\lang1026\langfe2052\super\loch\f39\hich\af39\dbch\af11\cgrid\langnp1026\langfenp2052 \sbasedon0 \snext110 \slink111 LIMPA_T4WINEXTERNAL;}{\*\cs111 \additive \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0
\b\f39\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink110 \slocked LIMPA_T4WINEXTERNAL Char;}}{\*\listtable{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600
\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23
\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660{\listlevel\levelnfc3
\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}
\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0
\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li3240
\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab\ai0\af42\afs20 \ltrch\fcs0 \b\i0\f42\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab\ai0\af42\afs20 \ltrch\fcs0 \b\i0\f42\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\strike0\f42\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers
\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\strike0\f42\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040
\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462}
{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af42\afs20 \ltrch\fcs0 \b\i0\f42\fs20\fbias0 \fi-357\li357
\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 \b\i0\fs20\fbias0 \fi-360\li720
\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li1077
\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\strike0\f42\fs20\ulnone\fbias0
\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0
\b0\i0\strike0\f42\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1
\ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1
\ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1
\af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440
\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel
\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\strike0\f42\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\strike0\f42\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255
\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255
\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname
;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af42\afs20 \ltrch\fcs0
\b\i0\f42\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af42\afs20 \ltrch\fcs0
\b\i0\f42\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0
\b\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0
\b0\i0\strike0\f42\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\strike0\f42\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers
\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers
\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers
;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}
\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160
\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23
\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760
\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname
;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af42\afs20 \ltrch\fcs0
\b\i0\f42\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af42\afs20 \ltrch\fcs0
\b\i0\f42\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0
\b0\i0\f42\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0
\b0\i0\strike0\f42\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\strike0\f42\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers
\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers
\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers
;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}
\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af42\afs20 \ltrch\fcs0 \b\i0\f42\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af42\afs20 \ltrch\fcs0 \b\i0\f42\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\strike0\f42\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\strike0\f42\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af42\afs20 \ltrch\fcs0 \b0\i0\f42\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid974869818}
{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1797\lin1797 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0
\fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname
;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506
\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320
\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23
\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0
\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0
\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23
\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480
\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338
\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160
\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040
\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271}
{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149
\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880
\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703
\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0
\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1}
{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764
\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10}
{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898
\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19}
{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271
\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28}
{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945
\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37}
{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel
\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136
\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}
{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40}
{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel
\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927
\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46}
{\listoverride\listid1567649130\listoverridecount0\ls47}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid132812\rsid133779\rsid545436
\rsid675178\rsid1799879\rsid2706272\rsid2829013\rsid3958498\rsid4196742\rsid4605597\rsid5720217\rsid6447288\rsid6703590\rsid7042433\rsid7755012\rsid8343752\rsid12264892\rsid12265033\rsid12279895\rsid12678245\rsid13524579\rsid13651777\rsid14051756
\rsid14363135\rsid15206214\rsid15879825\rsid16255017}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\title English}{\creatim\yr2014\mo11\dy28\hr8\min19}
{\revtim\yr2015\mo3\dy26\hr10\min49}{\version1}{\edmins0}{\nofpages3}{\nofwords1302}{\nofchars7426}{\nofcharsws8711}{\vern57439}}{\*\userprops {\propname db_document_id}\proptype30{\staticval 22469}{\propname ContentTypeId}\proptype30{\staticval 0x0101002
2795EB251D4644FBEC12BD5D4B08D7C}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect
\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen
\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1
\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel
\wrppunct\asianbrkrule\rsidroot4605597\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0
{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6447288 \chftnsep
\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6447288 \chftnsepc
\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6447288 \chftnsep
\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6447288 \chftnsepc
\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3
\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}
{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar
\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1
\af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 MICROSOFT SOFTWARE LICENSE TERMS}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs28\alang1025 \ltrch\fcs0
\b\fs28\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid545436\charrsid545436 \hich\af39\dbch\af13\loch\f39 Microsoft }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\caps\fs20\dbch\af13\insrsid14363135 \hich\af39\dbch\af13\loch\f39 AZURE }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \caps\fs20\dbch\af13\insrsid545436\charrsid545436 \hich\af39\dbch\af13\loch\f39 Mobile Engagement}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid545436\charrsid545436 \hich\af39\dbch\af13\loch\f39 }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 SDK }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0
\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, whic\hich\af39\dbch\af13\loch\f39
h includes the media on which you received it, if any. The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 updates,}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 supplements,}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 Internet-based services, and}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 support services}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0
\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
for this software, unless other terms accompany those items. If so, those terms apply.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 By using the software, you accept these terms. If you do not accept them, do not use the software.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid4605597
\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0
\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\insrsid14051756 \hich\af39\dbch\af11\loch\f39 If you comply with these license terms, you have the perpetual rights below.}{
\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1
\af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {
\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 Installation and Use.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
You may install and use any number of copies of the software on your devices.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 b.\tab}}\pard \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 Third Party Programs.}{\rtlch\fcs1
\ab0\af39\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third
\hich\af39\dbch\af13\loch\f39 party program are included for your information only.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 2.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1
\af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {
\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 Distributable Code.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \cs57\b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
The software contains code that you are permitted to distribute in programs you develop if you comply with the terms below.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 i.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {
\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 Right to Use and Distribute.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 \hich\f39
The code and text files listed below are \'93\loch\f39 \hich\f39 Distributable Code.\'94}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs19 \ltrch\fcs0 \f3\fs19\cf17\lang9\langfe1033\langnp9\insrsid132812\charrsid132812 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid12279895 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1
\af39 \ltrch\fcs0 \ul\lang9\langfe1033\langnp9\insrsid132812\charrsid132812 \hich\af39\dbch\af11\loch\f39 Redistributable }{\rtlch\fcs1 \af39 \ltrch\fcs0 \ul\lang9\langfe1033\langnp9\insrsid12265033\charrsid132812 \hich\af39\dbch\af11\loch\f39 Files}{
\rtlch\fcs1 \af39 \ltrch\fcs0 \lang9\langfe1033\langnp9\insrsid12265033\charrsid132812 \hich\af39\dbch\af11\loch\f39 . You may copy and distribute the object code form of }{\rtlch\fcs1 \af39 \ltrch\fcs0 \lang9\langfe1033\langnp9\insrsid132812 .}{
\rtlch\fcs1 \af39 \ltrch\fcs0 \lang9\langfe1033\langnp9\insrsid13651777\charrsid132812 \hich\af39\dbch\af11\loch\f39 dll}{\rtlch\fcs1 \af39 \ltrch\fcs0 \lang9\langfe1033\langnp9\insrsid7042433 \hich\af39\dbch\af11\loch\f39 , .jar and iOS framework}{
\rtlch\fcs1 \af39 \ltrch\fcs0 \lang9\langfe1033\langnp9\insrsid12279895 \hich\af39\dbch\af11\loch\f39 and static library }{\rtlch\fcs1 \af39 \ltrch\fcs0 \lang9\langfe1033\langnp9\insrsid132812 \hich\af39\dbch\af11\loch\f39 files}{\rtlch\fcs1 \af39
\ltrch\fcs0 \lang9\langfe1033\langnp9\insrsid12265033\charrsid132812 .}{\rtlch\fcs1 \af39 \ltrch\fcs0 \lang9\langfe1033\langnp9\insrsid12279895\charrsid12279895
\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20
\ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 Third Party Distribution}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 ii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {
\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 Distribution Requirements.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
For any Distributable Code you distribute, you must}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20
\ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 add significant primary functionality to it in your\hich\af39\dbch\af13\loch\f39 programs;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756\charrsid2829013 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid14051756\charrsid2829013 \hich\af39\dbch\af13\loch\f39 require distributors and external end users to agree to terms that protect it at least as much as this agreement; }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid4605597\charrsid2829013
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 display your valid copyright notice on your programs; and}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\hich\f39 \rquote \loch\f39 fees, related to the distribution or use of your programs.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 iii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {
\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 Distribution Restrictions.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 You may not}{\rtlch\fcs1
\af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20
\ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 alter any copyright, trademark or patent notice in the Distributab\hich\af39\dbch\af13\loch\f39 le Code;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 use Microsoft\hich\f39 \rquote \loch\f39 s trademarks in your programs\hich\f39 \rquote \loch\f39 names or in a way that suggests your programs come from or are endorsed by Microsoft;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756\charrsid2829013 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid14051756\charrsid2829013 \hich\af39\dbch\af13\loch\f39 distribute Distributable Code to run on a platform other than the Microsoft }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid3958498\charrsid2829013
\hich\af39\dbch\af13\loch\f39 Azure }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756\charrsid2829013 \hich\af39\dbch\af13\loch\f39 platform;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597\charrsid2829013
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 include Distributa\hich\af39\dbch\af13\loch\f39 ble Code in malicious, deceptive or unlawful programs; or}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\cf17\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modif
\hich\af39\dbch\af13\loch\f39 ication or distribution, that}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20
\ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 the code be disclosed or distributed in source code form; or}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 others have the right to modify it.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 3.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1
\af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 SCOPE OF LICENSE.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
The software is licensed, not sold. This agreement only gives you some rights to use the software. M\hich\af39\dbch\af13\loch\f39
icrosoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software th
\hich\af39\dbch\af13\loch\f39 a\hich\af39\dbch\af13\loch\f39 t only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 work around any technical limitations in the software;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this li\hich\af39\dbch\af13\loch\f39 mitation;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 publish the software for others to copy;}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 rent, lease or lend the software; or}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 use the software for commercial software hosting services.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 4.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1
\af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 5.\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 EXPORT RESTRICTIONS.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 The software is subject to United States export laws and regulations. You must comply w
\hich\af39\dbch\af13\loch\f39 ith all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{\rtlch\fcs1 \ab0\af39\afs20
\ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 www.microsoft.com/exporting}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 .}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0
\cs73\b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 6.\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 SUPPORT SERVICES. }{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 Because thi\hich\af39\dbch\af13\loch\f39 \hich\f39 s software is \'93\loch\f39 \hich\f39 as is,\'94
\loch\f39 we may not provide support services for it.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 7.\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 ENTIRE AGREEMENT.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support\hich\af39\dbch\af13\loch\f39 services.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0
\b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 8.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 APPLICABLE LAW.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {
\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 United States.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws\hich\af39\dbch\af13\loch\f39
of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 b.\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 Outside the United States.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 If you acquired the software in any other country, the laws of that country app
\hich\af39\dbch\af13\loch\f39 ly.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 9.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1
\af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 LEGAL EFFECT.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software.\hich\af39\dbch\af13\loch\f39
This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.}{\rtlch\fcs1 \ab0\af39\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 10.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 \hich\f39
DISCLAIMER OF WARRANTY. The software is licensed \'93\loch\f39 \hich\f39 as-is.\'94\loch\f39 You bear the risk of using it. Microsoft gives no express warran\hich\af39\dbch\af13\loch\f39
ties, guarantees or conditions. You may have additional consumer rights or statutory guarantees under your local laws which this agreement cannot change. To the extent permitted under your local laws, Microsoft excludes the implied warranties of merchanta
\hich\af39\dbch\af13\loch\f39 b\hich\af39\dbch\af13\loch\f39 ility, fitness for a particular purpose and non-infringement.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 FOR AUSTRALIA \hich\f39 \endash \loch\f39
You have statutory guarantees under the Australian Consumer Law and nothing in these terms is intended to affect those rights.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 11.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1
\af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAM\hich\af39\dbch\af13\loch\f39 AGES}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\insrsid14051756
\hich\af39\dbch\af11\loch\f39 . You can recover from Microsoft and its suppliers only direct damages up to U.S. $5.00. You cannot recover any other damages, including consequential, lost profits, special, indirect or incidental damages.}{\rtlch\fcs1
\af39\afs20 \ltrch\fcs0 \fs20\insrsid4605597
\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 This limitation applies to}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39 anything related\hich\af39\dbch\af13\loch\f39 to the software, services, content (including code) on third party Internet sites, or third party programs; and}{\rtlch\fcs1 \af39\afs20
\ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid14051756 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756
\hich\af39\dbch\af13\loch\f39 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitte\hich\af39\dbch\af13\loch\f39 d by applicable law.}{\rtlch\fcs1 \af39\afs20
\ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14051756 \hich\af39\dbch\af13\loch\f39
It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, cons
\hich\af39\dbch\af13\loch\f39 equential or other damages.}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid4605597
\par }\pard\plain \ltrpar\s79\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid132812 \rtlch\fcs1 \ab\af39\afs19\alang1025 \ltrch\fcs0
\b\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid132812\charrsid16255017 \hich\af39\dbch\af13\loch\f39
Please note: As this software is distributed in Quebec, Canada, these license terms are provided below in French.
\par }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid132812\charrsid16255017 \hich\af39\dbch\af13\loch\f39 Remarque\~\hich\f39 : Ce logiciel \'e9\loch\f39 \hich\f39 tant distribu\'e9\loch\f39 \hich\f39 au Qu\'e9
\loch\f39 bec, Canada, les termes de cette licence sont fournis ci-dessous en f\hich\af39\dbch\af13\loch\f39 \hich\f39 ran\'e7\loch\f39 ais.
\par }\pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid132812 \rtlch\fcs1 \af39\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\langnp1036\insrsid132812\charrsid16255017 \hich\af39\dbch\af11\loch\f39 \hich\f39 EXON\'c9\loch\f39
RATION DE GARANTIE}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid132812\charrsid16255017 \hich\af39\dbch\af11\loch\f39 \hich\f39 . Le logiciel vis\'e9\loch\f39 \hich\f39 par une licence est offert \'ab\loch\f39
\hich\f39 tel quel \'bb\loch\f39 \hich\f39 . Toute utilisation de ce logiciel est \'e0\loch\f39 \hich\f39 votre seule risque et p\'e9\loch\f39 ril. Microsoft n\hich\f39 \rquote \loch\f39 \hich\f39 accorde aucune autre garantie expresse. Vous pouvez b
\'e9\loch\f39 \hich\f39 n\'e9\loch\f39 ficier de droits additionnel\hich\af39\dbch\af11\loch\f39 \hich\f39
s en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9\loch\f39 marchande, d\hich\f39 \rquote \loch\f39 \hich\f39 ad\'e9
\loch\f39 \hich\f39 quation \'e0\loch\f39 un usage particulier et d\hich\f39 \rquote \loch\f39 \hich\f39 absence de contrefa\'e7\loch\f39 on s\hich\af39\dbch\af11\loch\f39 o\hich\af39\dbch\af11\loch\f39 nt exclues.
\par }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\langnp1036\insrsid132812\charrsid16255017 \hich\af39\dbch\af11\loch\f39 \hich\f39 LIMITATION DES DOMMAGES-INT\'c9\loch\f39 \hich\f39 R\'ca\loch\f39 \hich\f39
TS ET EXCLUSION DE RESPONSABILIT\'c9\loch\f39 POUR LES DOMMAGES}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\langnp1036\insrsid132812\charrsid16255017 \hich\af39\dbch\af11\loch\f39 \hich\f39
. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0\loch\f39 \hich\f39 hauteur de 5,00 $ US. Vous ne pouvez pr\'e9\loch\f39 tendre \loch\af39\dbch\af11\hich\f39 \'e0\loch\f39 \hich\f39
aucune indemnisation pour les autres dommages, y compris les dommages sp\'e9\loch\f39 \hich\f39 ciaux, indirects ou accessoires et pertes de b\'e9\loch\f39 \hich\f39 n\'e9\loch\f39 fices.
\par \hich\af39\dbch\af11\loch\f39 Cette limitation concerne :
\par \bullet \tab \hich\af39\dbch\af11\loch\f39 \hich\f39 tout ce qui est reli\'e9\loch\f39 au logiciel, aux services ou au contenu (y compris le code) figurant sur \hich\af39\dbch\af11\loch\f39 des sites Internet tiers ou dans des programmes tiers ; et
\par \bullet \tab \hich\af39\dbch\af11\loch\f39 \hich\f39 les r\'e9\loch\f39 \hich\f39 clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9\loch\f39 \hich\f39 stricte, de n\'e9\loch\f39 gligence ou d\hich\f39 \rquote
\loch\f39 \hich\f39 une autre faute dans la limite autoris\'e9\loch\f39 e par la loi en vigueur.
\par \hich\af39\dbch\af11\loch\f39 Elle s\hich\f39 \rquote \hich\af39\dbch\af11\loch\f39 \hich\f39 applique \'e9\loch\f39 \hich\f39 galement, m\'ea\loch\f39 \hich\f39 me si Microsoft connaissait ou devrait conna\'ee\loch\f39 tre l\hich\f39 \rquote \'e9
\loch\f39 \hich\f39 ventualit\'e9\loch\f39 d\hich\f39 \rquote \loch\f39 un tel dommage. Si votre pays n\hich\f39 \rquote \loch\f39 autorise pas l\hich\f39 \rquote \loch\f39 \hich\f39 exclusion ou la limitation de responsabilit\'e9\loch\f39
pour les dommages indirects, accessoires ou de quelque nature que ce soit, i\hich\af39\dbch\af11\loch\f39 l\hich\af39\dbch\af11\loch\f39 se peut que la limitation ou l\hich\f39 \rquote \loch\f39 exclusion ci-dessus ne s\hich\f39 \rquote \loch\f39
\hich\f39 appliquera pas \'e0\loch\f39 \hich\f39 votre \'e9\loch\f39 gard.
\par }{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\langnp1036\insrsid132812\charrsid16255017 \hich\af39\dbch\af11\loch\f39 EFFET JURIDIQUE}{\rtlch\fcs1 \af39\afs20 \ltrch\fcs0
\fs20\lang1036\langfe1033\langnp1036\insrsid132812\charrsid16255017 \hich\af39\dbch\af11\loch\f39 \hich\f39 . Le pr\'e9\loch\f39 \hich\f39 sent contrat d\'e9\loch\f39 crit certains droits juridiques. Vous pourriez avoir d\hich\f39 \rquote \loch\f39
\hich\f39 autres droits pr\'e9\loch\f39 \hich\f39 vus par les lois de votre pays. Le pr\'e9\loch\f39 sent contrat ne modif\hich\af39\dbch\af11\loch\f39 \hich\f39 ie pas les droits que vous conf\'e8\loch\f39
rent les lois de votre pays si celles-ci ne le permettent pas.
\par }\pard \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0 {\rtlch\fcs1 \af39\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid132812
\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f
7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87
615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad
79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b
5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab
999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9
699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586
8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6
0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f
9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be
15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979
3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d
32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a
f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86
e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb
44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a
6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c
3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256
5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276
b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8
c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e
51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95
b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff
6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6
9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239
b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449
59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8
2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468
656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4
350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624
52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141
73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000
0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000
000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019
0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000
000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027
00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000}
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;
\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;
\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority59 \lsdlocked0 Table Grid;
\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;
\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;
\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;
\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;
\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;
\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;
\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;
\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;
\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4;
\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4;
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1;
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1;
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2;
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2;
\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3;
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4;
\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4;
\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5;
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5;
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6;
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6;
\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark;
\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1;
\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1;
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2;
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3;
\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3;
\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4;
\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4;
\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5;
\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5;
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6;
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000
4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000003a0000
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000002000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffdffffff0a000000120000000400000005000000060000000700000008000000090000000b0000000e0000000c0000000d0000000f0000001100000010000000130000001a000000feffffff1400000015000000160000001700000018000000190000001b000000fefffffffeffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000701a
6638ed67d0010300000080270000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff050000000000000000000000000000000000000000000000701a6638ed67d001
701a6638ed67d00100000000000000000000000032003500cd00dd00c10058004600c3005900550053005400de004900db00db00c300d900310034004700d0003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000701a6638ed67
d001701a6638ed67d0010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000
00000000000000000000000000000000ad0d0000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a00
00001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f00000030000000310000003200000033000000340000003500000036000000feffffff3800000039000000
3a0000003b0000003c0000003d0000003e0000003f0000004000000041000000420000004300000044000000feffffff460000004700000048000000feffffff4a0000004b0000004c0000004d0000004e000000feffffff50000000510000005200000053000000feffffff550000005600000057000000580000005900
0000feffffff5b0000005c0000005d0000005e0000005f000000600000006100000062000000630000006400000065000000660000006700000068000000690000006a0000006b0000006c0000006d0000006e0000006f000000700000007100000072000000730000007400000075000000760000007700000078000000
790000007a0000007b0000007c0000007d0000007e0000007f000000800000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d38223f3e3c63743a636f6e74656e7454797065536368656d612063743a5f3d2222206d613a5f3d2222206d613a636f6e74656e74547970654e616d65
3d22446f63756d656e7422206d613a636f6e74656e745479706549443d223078303130313030323237393545423235314434363434464245433132424435443442303844374322206d613a636f6e74656e745479706556657273696f6e3d223022206d613a636f6e74656e74547970654465736372697074696f6e3d2243
72656174652061206e657720646f63756d656e742e22206d613a636f6e74656e745479706553636f70653d2222206d613a76657273696f6e49443d2264636264643635633032373738363565303939666233646330353635336235372220786d6c6e733a63743d22687474703a2f2f736368656d61732e6d6963726f736f
66742e636f6d2f6f66666963652f323030362f6d657461646174612f636f6e74656e74547970652220786d6c6e733a6d613d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f706572746965732f6d65746141747472696275746573
223e0d0a3c7873643a736368656d61207461726765744e616d6573706163653d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f7065727469657322206d613a726f6f743d227472756522206d613a6669656c647349443d22346165
62323063306533343432363733616637656531303738363435383736342220786d6c6e733a7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a703d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f
6d657461646174612f70726f70657274696573223e0d0a3c7873643a656c656d656e74206e616d653d2270726f70657274696573223e0d0a3c7873643a636f6d706c6578547970653e0d0a3c7873643a73657175656e63653e0d0a3c7873643a656c656d656e74206e616d653d22646f63756d656e744d616e6167656d65
6e74223e0d0a3c7873643a636f6d706c6578547970653e0d0a3c7873643a616c6c2f3e0d0a3c2f7873643a636f6d706c6578547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c2f7873643a73657175656e63653e0d0a3c2f7873643a636f6d706c6578547970653e0d0a3c2f7873643a656c656d656e743e0d0a
3c2f7873643a736368656d613e0d0a3c7873643a736368656d61207461726765744e616d6573706163653d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f7061636b6167652f323030362f6d657461646174612f636f72652d70726f706572746965732220656c656d656e74466f
726d44656661756c743d227175616c69666965642220617474726962757465466f726d44656661756c743d22756e7175616c69666965642220626c6f636b44656661756c743d2223616c6c2220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f7061636b6167652f
323030362f6d657461646174612f636f72652d70726f706572746965732220786d6c6e733a7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a7873693d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612d696e7374616e
63652220786d6c6e733a64633d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f2220786d6c6e733a64637465726d733d22687474703a2f2f7075726c2e6f72672f64632f7465726d732f2220786d6c6e733a6f646f633d22687474703a2f2f736368656d61732e6d6963726f736f6674
2e636f6d2f6f66666963652f696e7465726e616c2f323030352f696e7465726e616c446f63756d656e746174696f6e223e0d0a3c7873643a696d706f7274206e616d6573706163653d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f2220736368656d614c6f636174696f6e3d226874
74703a2f2f6475626c696e636f72652e6f72672f736368656d61732f786d6c732f7164632f323030332f30342f30322f64632e787364222f3e0d0a3c7873643a696d706f7274206e616d6573706163653d22687474703a2f2f7075726c2e6f72672f64632f7465726d732f2220736368656d614c6f636174696f6e3d2268
7474703a2f2f6475626c696e636f72652e6f72672f736368656d61732f786d6c732f7164632f323030332f30342f30322f64637465726d732e787364222f3e0d0a3c7873643a656c656d656e74206e616d653d22636f726550726f706572746965732220747970653d2243545f636f726550726f70657274696573222f3e
0d0a3c7873643a636f6d706c657854797065206e616d653d2243545f636f726550726f70657274696573223e0d0a3c7873643a616c6c3e0d0a3c7873643a656c656d656e74207265663d2264633a63726561746f7222206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c65
6d656e74207265663d2264637465726d733a6372656174656422206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74207265663d2264633a6964656e74696669657222206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c787364
3a656c656d656e74206e616d653d22636f6e74656e745479706522206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e6722206d613a696e6465783d223022206d613a646973706c61794e616d653d22436f6e74656e74205479706522206d613a726561644f6e
6c793d2274727565222f3e0d0a3c7873643a656c656d656e74207265663d2264633a7469746c6522206d696e4f63637572733d223022206d61784f63637572733d223122206d613a696e6465783d223422206d613a646973706c61794e616d653d225469746c65222f3e0d0a3c7873643a656c656d656e74207265663d22
64633a7375626a65637422206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74207265663d2264633a6465736372697074696f6e22206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74206e616d653d
226b6579776f72647322206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74207265663d2264633a6c616e677561676522206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c787364
3a656c656d656e74206e616d653d2263617465676f727922206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74206e616d653d2276657273696f6e22206d696e4f63637572733d223022206d61784f63637572733d
22312220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74206e616d653d227265766973696f6e22206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67223e0d0a3c7873643a616e6e6f746174696f6e3e0d0a3c7873643a64
6f63756d656e746174696f6e3e0d0a202020202020202020202020202020202020202020202020546869732076616c756520696e6469636174657320746865206e756d626572206f66207361766573206f72207265766973696f6e732e20546865206170706c69636174696f6e20697320726573706f6e7369626c652066
6f72207570646174696e6720746869732076616c75652061667465722065616368207265766973696f6e2e0d0a20202020202020202020202020202020202020203c2f7873643a646f63756d656e746174696f6e3e0d0a3c2f7873643a616e6e6f746174696f6e3e0d0a3c2f7873643a656c656d656e743e0d0a3c787364
3a656c656d656e74206e616d653d226c6173744d6f646966696564427922206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74207265663d2264637465726d733a6d6f64696669656422206d696e4f63637572733d
223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74206e616d653d226c6173745072696e74656422206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a6461746554696d65222f3e0d0a3c7873643a656c656d656e74206e616d653d22636f6e
74656e7453746174757322206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c2f7873643a616c6c3e0d0a3c2f7873643a636f6d706c6578547970653e0d0a3c2f7873643a736368656d613e0d0a3c2f63743a636f6e74656e74547970655363
68656d613e000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a64617461500072006f007000650072007400690065007300000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000370000006d030000000000004700cf00cd004600c80054005800d300da00d400da003100d700c1005800ce00da004d00
4700d800c80051003d003d000000000000000000000000000000000032000101020000000b000000060000000000000000000000000000000000000000000000701a6638ed67d001701a6638ed67d0010000000000000000000000004900740065006d000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000a000201ffffffff07000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000045000000c100000000000000500072006f007000650072007400690065007300000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000049000000540100000000000073746f72654974656d2064733a6974656d49443d227b3835374446423731
2d363337312d343436312d393346382d3845464238463936444531427d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a73
6368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f636f6e74656e7454797065222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66
742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f706572746965732f6d65746141747472696275746573222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d61222f3e3c64733a736368656d6152656620
64733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f70657274696573222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267
2f7061636b6167652f323030362f6d657461646174612f636f72652d70726f70657274696573222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f
2f7075726c2e6f72672f64632f7465726d732f222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f696e7465726e616c2f323030352f696e7465726e616c446f63756d656e746174696f6e222f3e3c2f64733a736368
656d61526566733e3c2f64733a6461746173746f72654974656d3e000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3822207374616e64616c6f6e653d22796573223f3e3c44696374696f6e617279205361766564427956657273696f
6e3d22332e362e31382e3022204d696e696d756d56657273696f6e3d22332e362e342e302220786d6c6e733d22687474703a2f2f736368656d61732e627573696e6573732d696e746567726974792e636f6d2f6465616c6275696c6465722f323030362f64696374696f6e617279222f3e00000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d206473
3a6974656d49443d227b41313435464231412d463333352d344545422d394244452d3135454545384331423841317d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64
733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e627573696e6573732d696e746567726974792e636f6d2f6465616c6275696c6465722f323030362f64696374696f6e617279222f3e3c2f64733a736368656d61526566733e3c2f64733a6461
746173746f72654974656d3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e3c623a536f75726365735500dc003100
4c00ca00590049004d00d6005500da003200cd00dd00c200d100c6005100da003100c90041003d003d000000000000000000000000000000000032000100ffffffffffffffff090000000000000000000000000000000000000000000000701a6638ed67d001701a6638ed67d00100000000000000000000000049007400
65006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff0a000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000004f0000000e010000000000005000
72006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000540000005501000000000000
c900c70047003500c400c90055004a0058005500470042004c004600db0046004b00c5005000c4005600d0003d003d000000000000000000000000000000000032000101080000000e0000000c0000000000000000000000000000000000000000000000701a6638ed67d001701a6638ed67d00100000000000000000000
00002053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e73
3d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b41394342433635332d304338322d344544392d394342372d44384231393930453942
41347d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f7363
68656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e00000000000000000000000000000000000000000000000000000000000000
0000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3822207374616e64616c6f6e653d22796573223f3e3c53657373696f6e20786d6c6e733d22687474703a2f2f736368656d61732e627573696e6573732d696e746567726974792e636f6d2f6465616c62
75696c6465722f323030362f616e7377657273223e3c5661726961626c65204e616d653d226d73636f6d223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2266696c6574797065223e3c56616c75653e2e7274663c2f56616c75653e3c2f56617269
61626c653e3c5661726961626c65204e616d653d226c616e6775616765616c6c223e3c56616c75653e456e676c6973683c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d225f5f6576656e7474617267657422204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c73
65222f3e3c5661726961626c65204e616d654900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff0d000000ffffffff00000000000000000000000000000000000000000000000000000000
00000000000000005a000000e70c000000000000500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
000000000000000000008e0000005101000000000000d600cb003100db0030005700d000cb00c400d400da00d300dc00dd004900350059004400db0046004300d0003d003d000000000000000000000000000000000032000100ffffffffffffffff0f0000000000000000000000000000000000000000000000701a6638
ed67d001701a6638ed67d0010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff10000000ffffffff00000000000000000000000000000000000000000000
000000000000000000000000000094000000db000000000000008100000082000000830000008400000085000000860000008700000088000000890000008a0000008b0000008c0000008d000000feffffff8f00000090000000910000009200000093000000feffffff950000009600000097000000feffffff99000000
9a0000009b0000009c0000009d000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3d225f5f6576656e74617267756d656e7422204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c7365222f3e3c5661726961626c65204e616d653d225f5f72657175657374646967657374222052656c6576616e74
3d2266616c7365223e3c56616c75653e3078324131323735303138353444364537323542353836343341433634323430443243304537383035323041334536364343353434334241463941434136373336353231344434453230363946393043464635324636303542383338454338443533323532373441434642334533
36363734463338324439434344353144414336302c3234204a756e20323031332031363a30353a3130202d303030303c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d225f5f6576656e7476616c69646174696f6e222052656c6576616e743d2266616c7365223e3c56616c75653e2f
77455741674b4f3239697043414c623449756d444c2b75437032397970624e71637a6d5230493767414e52424e67333c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2263746c303024706c616365686f6c6465726d61696e24686663657370636f6e74726163747265666572656e63
65222052656c6576616e743d2266616c7365223e3c56616c75653e323031332d4d41494e422d3030303636303c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226c61756e6368646976616374696f6e22204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c736522
2f3e3c5661726961626c65204e616d653d225f5f737064756d6d79746578743122204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c7365222f3e3c5661726961626c65204e616d653d225f5f737064756d6d79746578743222204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c73
65222f3e3c5661726961626c65204e616d653d2263616e616461617661696c223e3c56616c75653e747275653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2263616e6164616672656e6368223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c56
61726961626c65204e616d653d2266696c65666f726d6174223e3c56616c75653e747275653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d22736f66747761726574797065223e3c56616c75653e467265652c205374616e64616c6f6e6520536f6674776172653c2f56616c75653e
3c2f5661726961626c653e3c5661726961626c65204e616d653d2270726f647563746e616d65223e3c56616c75653e57696e646f777320417a757265204d6f62696c652053444b3c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226e756d6265726f66636f70696573223e3c56616c
75653e416e79206e756d626572206f6620636f706965733c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2270726f6475637476657273696f6e223e3c56616c75653e4e6f6e653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2276657273696f
6e76697369626c65223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226368616e6e656c223e3c56616c75653e52657461696c3c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d227374616e64616c6f6e657573
657269676874223e3c56616c75653e4f6e2074686520757365722773206465766963652873293c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226d65646961656c656d656e747374656d706c61746573223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c
653e3c5661726961626c65204e616d653d2264697374726962757461626c65636f6465223e3c56616c75653e747275653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2264697374726962757461626c65636f646574797065223e3c56616c75653e4d4643732c2041544c7320616e
6420435254733c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d22696e7465726e616c726561737369676e6d656e74223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226c6963656e73657472616e7366657222
3e3c56616c75653e747275653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226f746865726d6963726f736f667470726f6772616d73223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2270726572656c6561
7365636f6465223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d227468697264706172747970726f6772616d73223e3c56616c75653e747275653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2262656e6368
6d61726b696e67223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226d706567223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d22696e7465726e6574626173656473657276
69636573223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226f726967696e61746f72223e3c56616c75653e5245444d4f4e445c697269736c3c2f56616c75653e3c2f5661726961626c653e3c506172616d65746572204e616d653d2264625f6469
73706c61795f616c6c5f636f6d6d656e7473223e3c56616c75653e66616c73653c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f73686f775f73756d6d617279223e3c56616c75653e64697361626c65643c2f56616c75653e3c2f506172616d657465723e3c50617261
6d65746572204e616d653d2264625f74656d706c6174655f666f726d223e3c56616c75653e35663336633330632d333166662d343666652d386264382d3165633864663732623131363c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f74656d706c6174655f72656665
72656e6365223e3c56616c75653e5553455445524d535f4d41494e423c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f74656d706c6174655f76657273696f6e223e3c56616c75653e32303132303831363c2f56616c75653e3c2f506172616d657465723e3c50617261
6d65746572204e616d653d2264625f7472616e73616374696f6e5f65787465726e616c5f6c6162656c223e3c56616c75653e323031332d4d41494e422d3030303636303c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f7472616e73616374696f6e5f6964223e3c5661
6c75653e383238393c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f766973697465645f7061676573223e3c56616c75653e313c2f56616c75653e3c56616c75653e323c2f56616c75653e3c56616c75653e333c2f56616c75653e3c56616c75653e343c2f56616c7565
3e3c56616c75653e363c2f56616c75653e3c56616c75653e373c2f56616c75653e3c2f506172616d657465723e3c2f53657373696f6e3e000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e
653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b39323946373141362d303939352d343135442d383132432d3545433532413533453435377d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666
696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e627573696e6573732d696e746567726974792e636f6d2f6465616c6275696c6465722f323030362f616e73776572
73222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c3f6d736f2d636f6e74656e74547970653f3e3c466f726d54656d706c6174657320786d6c6e733d
22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f7368617265706f696e742f76332f636f6e74656e74747970652f666f726d73223e3c446973706c61793e446f63756d656e744c696272617279466f726d3c2f446973706c61793e3c456469743e446f63756d656e744c696272617279466f726d
3c2f456469743e3c4e65773e446f63756d656e744c696272617279466f726d3c2f4e65773e3c2f466f726d54656d706c617465733e00000000000000000000000000000000000000000000000000000000000000000000000000500072006f00700065007200740069006500730000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000980000004f0100000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e67
3d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b36394642423644412d324236432d344539332d423346332d4432314636303345433530427d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e
786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f7368617265706f696e742f76332f
636f6e74656e74747970652f666f726d73222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}}

Просмотреть файл

@ -0,0 +1,229 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System;
#pragma warning disable 162,429
namespace Microsoft.Azure.Engagement.Unity
{
public enum LocationReportingType
{
NONE=100,
LAZY=101,
REALTIME=102,
FINEREALTIME=103
} ;
public enum LocationReportingMode
{
NONE=200,
FOREGROUND=201,
BACKGROUND=202
} ;
public class EngagementAgent : MonoBehaviour
{
public const string PLUGIN_VERSION = "1.0.0";
static EngagementAgent _instance = null;
public Action<Dictionary<string, object>> onStatusReceivedDelegate ;
public static bool hasBeenInitialized = false;
private EngagementAgent()
{
}
public static void Logging(string _message)
{
if (EngagementConfiguration.ENABLE_PLUGIN_LOG)
Debug.Log("[Engagement] " + _message);
}
public static EngagementAgent Instance()
{
if (null == _instance)
{
_instance = (EngagementAgent)GameObject.FindObjectOfType(typeof(EngagementAgent));
if (null == _instance)
{
GameObject go = new GameObject("EngagementAgentObj");
_instance = go.AddComponent(typeof(EngagementAgent)) as EngagementAgent;
Logging("Initializing EngagementAgent v"+PLUGIN_VERSION);
}
}
return _instance;
}
public static void Initialize()
{
#if UNITY_EDITOR
#elif UNITY_IPHONE
EngagementWrapper.initializeEngagement(Instance().name);
#elif UNITY_ANDROID
string connectionString = EngagementConfiguration.ANDROID_CONNECTION_STRING;
if (string.IsNullOrEmpty(connectionString))
throw new ArgumentException("ANDROID_CONNECTION_STRING cannot be null");
EngagementWrapper.registerApp (
Instance().name,
connectionString,
(int)EngagementConfiguration.LOCATION_REPORTING_TYPE,
(int)EngagementConfiguration.LOCATION_REPORTING_MODE,
EngagementConfiguration.ENABLE_PLUGIN_LOG
);
#endif
hasBeenInitialized = true;
}
public static void StartActivity(string _activityName,Dictionary<object, object> _extraInfos = null)
{
string _extraInfosJSON = MiniJSON.Json.Serialize(_extraInfos);
Logging("startActivity:"+ _activityName+", "+_extraInfosJSON);
EngagementWrapper.startActivity(_activityName,_extraInfosJSON);
}
public static void EndActivity()
{
Logging("endActivity");
EngagementWrapper.endActivity();
}
public static void StartJob(string _jobName,Dictionary<object, object> _extraInfos = null)
{
string _extraInfosJSON = MiniJSON.Json.Serialize(_extraInfos);
Logging("startJob:"+ _jobName+", "+_extraInfosJSON);
EngagementWrapper.startJob(_jobName,_extraInfosJSON);
}
public static void EndJob(string _jobName)
{
Logging("endJob:"+ _jobName);
EngagementWrapper.endJob(_jobName);
}
public static void SendEvent(string _eventName, Dictionary<object, object> _extraInfos = null)
{
string _extraInfosJSON = MiniJSON.Json.Serialize(_extraInfos);
Logging("sendEvent:"+ _eventName+" ,"+_extraInfosJSON);
EngagementWrapper.sendEvent(_eventName,_extraInfosJSON);
}
public static void SendAppInfo( Dictionary<object, object> _extraInfos)
{
string extraInfosJSON = MiniJSON.Json.Serialize(_extraInfos);
Logging("sendAppInfo:"+extraInfosJSON);
EngagementWrapper.sendAppInfo(extraInfosJSON);
}
public static void SendSessionEvent(string _eventName, Dictionary<object, object> _extraInfos = null)
{
string extraInfosJSON = MiniJSON.Json.Serialize(_extraInfos);
Logging("SendSessionEvent:"+_eventName+" ,"+extraInfosJSON);
EngagementWrapper.sendSessionEvent(_eventName,extraInfosJSON);
}
public static void SendJobEvent(string _eventName, string _jobName, Dictionary<object, object> _extraInfos = null)
{
string extraInfosJSON = MiniJSON.Json.Serialize(_extraInfos);
Logging("SendJobEvent:"+_eventName+", Job: "+_jobName+" ,"+extraInfosJSON);
EngagementWrapper.sendJobEvent(_eventName,_jobName,extraInfosJSON);
}
public static void SendError(string _errorName, Dictionary<object, object> _extraInfos = null)
{
string extraInfosJSON = MiniJSON.Json.Serialize(_extraInfos);
Logging("SendError:"+_errorName+" ,"+extraInfosJSON);
EngagementWrapper.sendError(_errorName,extraInfosJSON);
}
public static void SendSessionError(string _errorName, Dictionary<object, object> _extraInfos = null)
{
string extraInfosJSON = MiniJSON.Json.Serialize(_extraInfos);
Logging("SendSessionError:"+_errorName+" ,"+extraInfosJSON);
EngagementWrapper.sendSessionError(_errorName,extraInfosJSON);
}
public static void SendJobError(string _errorName, string _jobName, Dictionary<object, object> _extraInfos = null)
{
string extraInfosJSON = MiniJSON.Json.Serialize(_extraInfos);
Logging("SendJobError:"+_errorName+", Job: "+_jobName+" ,"+extraInfosJSON);
EngagementWrapper.sendJobError(_errorName,_jobName,extraInfosJSON);
}
public static void GetStatus(Action<Dictionary<string, object>> _onStatusReceived)
{
if (_onStatusReceived == null)
Debug.LogError ("_onStatusReceived cannot be null");
else
{
Instance().onStatusReceivedDelegate = _onStatusReceived;
EngagementWrapper.getStatus();
}
}
public static void SaveUserPreferences()
{
EngagementWrapper.saveUserPreferences ();
}
public static void RestoreUserPreferences()
{
EngagementWrapper.restoreUserPreferences ();
}
public static void SetEnabled(bool _enable)
{
EngagementWrapper.setEnabled (_enable);
}
// Delegate from Unity
public void OnApplicationPause(bool pauseStatus)
{
Logging ("OnApplicationPause:" + pauseStatus);
EngagementWrapper.onApplicationPause (pauseStatus);
}
// Delegates from Native
public void onStatusReceived(string _serialized)
{
Logging ("OnStatusReceived: " + _serialized);
Dictionary<string, object> dict = (Dictionary<string, object>)MiniJSON.Json.Deserialize (_serialized);
if (onStatusReceivedDelegate != null) {
onStatusReceivedDelegate (dict);
onStatusReceivedDelegate = null;
}
}
// Forward the messages to the ReachAgent
public void onDataPushReceived(string _serialized)
{
EngagementReach.onDataPushMessage (_serialized);
}
public void onHandleURL(string _url)
{
EngagementReach.onHandleURLMessage (_url);
}
}
}
#pragma warning restore 162,429

Просмотреть файл

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: ee540bf6759b94a6188115ff912ae545
timeCreated: 1451413798
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,115 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System;
#pragma warning disable 162
namespace Microsoft.Azure.Engagement.Unity
{
public class EngagementReach : MonoBehaviour
{
/// <summary>
/// Event when receiving a string datapush.
///
/// The callback must of the form :
/// DataPushStringReceived(<b>string category</b>, <b>string body</b>) {}
/// </summary>
///
public static Action<string,string> StringDataPushReceived ;
/// <summary>
/// Event when receiving a base64 datapush.
///
/// The callback must of the form :
/// DataPushStringReceived(<b>string category</b>, <b>byte[] decodedBody</b>, <b>string encodedBody</b>) {}
/// </summary>
///
public static Action<string,byte[],string> Base64DataPushReceived ;
/// <summary>
/// Event when receiving an openUrl event
///
/// The callback must of the form :
/// HandleURL(<b>string url</b>) {}
/// </summary>
///
public static Action<string> HandleURL ;
private EngagementReach()
{
}
public static void Initialize( )
{
EngagementAgent.Logging ("Initializing Reach");
if (EngagementConfiguration.ENABLE_REACH == false)
{
Debug.LogError ("Reach must be enabled in configuration first");
return;
}
if (EngagementAgent.hasBeenInitialized == false)
{
Debug.LogError ("Agent must be initialized before initializing Reach");
return ;
}
EngagementWrapper.initializeReach();
}
// Delegates from Native
public static void onDataPushMessage(string _serialized)
{
Dictionary<string, object> dict = (Dictionary<string, object>)MiniJSON.Json.Deserialize(_serialized);
string category = null;
string body = null;
bool isBase64 = (bool)dict ["isBase64"];
if (dict["category"] != null)
category = WWW.UnEscapeURL (dict["category"].ToString(),System.Text.Encoding.UTF8);
EngagementAgent.Logging ("DataPushReceived, category: " + category+", isBase64:"+isBase64);
if (isBase64 == false) {
if (StringDataPushReceived != null)
{
body = WWW.UnEscapeURL (dict["body"].ToString(),System.Text.Encoding.UTF8);
StringDataPushReceived (category, body);
}
else
EngagementAgent.Logging ("WARNING: unitialized StringDataPushReceived");
} else {
if (Base64DataPushReceived != null) {
body = dict ["body"].ToString ();
byte[] data = Convert.FromBase64String (body);
Base64DataPushReceived (category, data,body);
}
else
EngagementAgent.Logging ("WARNING: unitialized Base64DataPushReceived");
}
}
public static void onHandleURLMessage(string _url)
{
EngagementAgent.Logging ("OnHandleURL: " + _url);
if (HandleURL != null)
HandleURL (_url);
else
EngagementAgent.Logging ("WARNING: unitialized HandleURL");
}
}
}
#pragma warning restore 162

Просмотреть файл

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 4ab1f364313ae714da78215ac2d21453
timeCreated: 1455263808
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,219 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
using UnityEngine;
using System.Runtime.InteropServices;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
namespace Microsoft.Azure.Engagement.Unity
{
internal class EngagementWrapper
{
#if UNITY_EDITOR
public static void initializeReach() { }
public static void startActivity( string _activityName, string _extraInfos) { }
public static void endActivity() { }
public static void startJob( string _jobName, string _extraInfos) { }
public static void endJob( string _jobName ) { }
public static void sendEvent( string _eventName, string _extraInfos) { }
public static void sendAppInfo( string _extraInfos) { }
public static void sendSessionEvent(string _eventName, string _extraInfosJSON) { }
public static void sendJobEvent(string _eventName, string _jobName,string _extraInfosJSON) { }
public static void sendError(string _errorName, string _extraInfosJSON) { }
public static void sendSessionError(string _errorName, string _extraInfosJSON) { }
public static void sendJobError(string _errorName, string _jobName, string _extraInfosJSON) { }
public static void registerForPushNotification() { }
public static void onApplicationPause(bool _paused ) { }
public static void setEnabled(bool _enabled ) { }
public static void getStatus()
{
Dictionary<string, object> status = new Dictionary<string, object>();
status.Add("deviceId", "UnityEditor");
status.Add("pluginVersion", EngagementAgent.PLUGIN_VERSION);
status.Add("nativeVersion", "0");
status.Add("isEnabled", false);
string serialized = MiniJSON.Json.Serialize(status);
EngagementAgent.Instance().onStatusReceived (serialized);
}
public static void saveUserPreferences() {}
public static void restoreUserPreferences() {}
#elif UNITY_IPHONE
[DllImport("__Internal")]
public static extern void initializeEngagement(string _instanceName );
[DllImport("__Internal")]
public static extern void initializeReach();
[DllImport("__Internal")]
public static extern void startActivity(string _activityName,string _extraInfos);
[DllImport("__Internal")]
public static extern void endActivity();
[DllImport("__Internal")]
public static extern void startJob(string _jobName,string _extraInfos);
[DllImport("__Internal")]
public static extern void endJob(string _jobName);
[DllImport("__Internal")]
public static extern void sendEvent(string _eventName,string _extraInfos);
[DllImport("__Internal")]
public static extern void sendAppInfo(string _extraInfos);
[DllImport("__Internal")]
public static extern void sendSessionEvent(string _eventName, string _extraInfosJSON);
[DllImport("__Internal")]
public static extern void sendJobEvent(string _eventName, string _jobName,string _extraInfosJSON);
[DllImport("__Internal")]
public static extern void sendError(string _errorName, string _extraInfosJSON);
[DllImport("__Internal")]
public static extern void sendSessionError(string _errorName, string _extraInfosJSON);
[DllImport("__Internal")]
public static extern void sendJobError(string _errorName, string _jobName, string _extraInfosJSON);
[DllImport("__Internal")]
public static extern void getStatus();
[DllImport("__Internal")]
public static extern void saveUserPreferences();
[DllImport("__Internal")]
public static extern void restoreUserPreferences();
[DllImport("__Internal")]
public static extern void setEnabled(bool _enabled);
[DllImport("__Internal")]
public static extern void onApplicationPause(bool _paused );
#elif UNITY_ANDROID
static AndroidJavaClass activityJavaClass = null;
static public AndroidJavaClass javaClass
{
get
{
if (null == activityJavaClass)
{
AndroidJavaClass player = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = player.GetStatic<AndroidJavaObject>("currentActivity");
/*Set Activity, will be used to retrieve URL scheme. */
activityJavaClass = new AndroidJavaClass("com.microsoft.azure.engagement.unity.EngagementWrapper");
activityJavaClass.CallStatic("setAndroidActivity", activity);
}
return activityJavaClass;
}
}
public static void registerApp(string _instanceName, string _connectionString, int _locationType, int _locationMode, bool _enablePluginLog )
{
javaClass.CallStatic("registerApp",_instanceName,_connectionString, _locationType,_locationMode,_enablePluginLog);
}
public static void initializeReach()
{
javaClass.CallStatic("initializeReach");
}
public static void startActivity(string _activityName, string _extraInfos)
{
javaClass.CallStatic("startActivity",_activityName, _extraInfos);
}
public static void endActivity()
{
javaClass.CallStatic("endActivity");
}
public static void startJob(string _jobName, string _extraInfos)
{
javaClass.CallStatic("startJob",_jobName, _extraInfos);
}
public static void endJob(string _jobName)
{
javaClass.CallStatic("endJob",_jobName);
}
public static void sendEvent(string _eventName, string _extraInfos)
{
javaClass.CallStatic("sendEvent",_eventName,_extraInfos);
}
public static void sendAppInfo( string _extraInfos)
{
javaClass.CallStatic("sendAppInfo",_extraInfos);
}
public static void sendSessionEvent(string _eventName, string _extraInfos)
{
javaClass.CallStatic("sendSessionEvent",_eventName,_extraInfos);
}
public static void sendJobEvent(string _eventName, string _jobName,string _extraInfos)
{
javaClass.CallStatic("sendJobEvent",_eventName,_jobName,_extraInfos);
}
public static void sendError(string _errorName, string _extraInfos)
{
javaClass.CallStatic("sendError",_errorName,_extraInfos);
}
public static void sendSessionError(string _errorName, string _extraInfos)
{
javaClass.CallStatic("sendSessionError",_errorName,_extraInfos);
}
public static void sendJobError(string _errorName, string _jobName, string _extraInfos)
{
javaClass.CallStatic("sendJobError",_errorName,_jobName,_extraInfos);
}
public static void getStatus( )
{
javaClass.CallStatic("getStatus");
}
public static void saveUserPreferences( )
{
}
public static void restoreUserPreferences( )
{
}
public static void setEnabled( bool _enabled)
{
javaClass.CallStatic("setEnabled",_enabled);
}
public static void onApplicationPause(bool _paused)
{
javaClass.CallStatic("onApplicationPause",_paused);
}
#else
# error "unsupported platform"
#endif
}
}

Просмотреть файл

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 12fb29933623747fca9c19dc0f8b6886
timeCreated: 1451413795
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: d3e849a6519f94d09822fe0afbeeaeae
folderAsset: yes
timeCreated: 1451413795
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,547 @@
/*
* Copyright (c) 2013 Calvin Rien
*
* Based on the JSON parser by Patrick van Bergen
* http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html
*
* Simplified it so that it doesn't throw exceptions
* and can be used in Unity iPhone with maximum code stripping.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Microsoft.Azure.Engagement.Unity.MiniJSON {
// Example usage:
//
// using UnityEngine;
// using System.Collections;
// using System.Collections.Generic;
// using MiniJSON;
//
// public class MiniJSONTest : MonoBehaviour {
// void Start () {
// var jsonString = "{ \"array\": [1.44,2,3], " +
// "\"object\": {\"key1\":\"value1\", \"key2\":256}, " +
// "\"string\": \"The quick brown fox \\\"jumps\\\" over the lazy dog \", " +
// "\"unicode\": \"\\u3041 Men\u00fa sesi\u00f3n\", " +
// "\"int\": 65536, " +
// "\"float\": 3.1415926, " +
// "\"bool\": true, " +
// "\"null\": null }";
//
// var dict = Json.Deserialize(jsonString) as Dictionary<string,object>;
//
// Debug.Log("deserialized: " + dict.GetType());
// Debug.Log("dict['array'][0]: " + ((List<object>) dict["array"])[0]);
// Debug.Log("dict['string']: " + (string) dict["string"]);
// Debug.Log("dict['float']: " + (double) dict["float"]); // floats come out as doubles
// Debug.Log("dict['int']: " + (long) dict["int"]); // ints come out as longs
// Debug.Log("dict['unicode']: " + (string) dict["unicode"]);
//
// var str = Json.Serialize(dict);
//
// Debug.Log("serialized: " + str);
// }
// }
/// <summary>
/// This class encodes and decodes JSON strings.
/// Spec. details, see http://www.json.org/
///
/// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary.
/// All numbers are parsed to doubles.
/// </summary>
public static class Json {
/// <summary>
/// Parses the string json into a value
/// </summary>
/// <param name="json">A JSON string.</param>
/// <returns>An List&lt;object&gt;, a Dictionary&lt;string, object&gt;, a double, an integer,a string, null, true, or false</returns>
public static object Deserialize(string json) {
// save the string for debug information
if (json == null) {
return null;
}
return Parser.Parse(json);
}
sealed class Parser : IDisposable {
const string WORD_BREAK = "{}[],:\"";
public static bool IsWordBreak(char c) {
return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -1;
}
enum TOKEN {
NONE,
CURLY_OPEN,
CURLY_CLOSE,
SQUARED_OPEN,
SQUARED_CLOSE,
COLON,
COMMA,
STRING,
NUMBER,
TRUE,
FALSE,
NULL
};
StringReader json;
Parser(string jsonString) {
json = new StringReader(jsonString);
}
public static object Parse(string jsonString) {
using (var instance = new Parser(jsonString)) {
return instance.ParseValue();
}
}
public void Dispose() {
json.Dispose();
json = null;
}
Dictionary<string, object> ParseObject() {
Dictionary<string, object> table = new Dictionary<string, object>();
// ditch opening brace
json.Read();
// {
while (true) {
switch (NextToken) {
case TOKEN.NONE:
return null;
case TOKEN.COMMA:
continue;
case TOKEN.CURLY_CLOSE:
return table;
default:
// name
string name = ParseString();
if (name == null) {
return null;
}
// :
if (NextToken != TOKEN.COLON) {
return null;
}
// ditch the colon
json.Read();
// value
table[name] = ParseValue();
break;
}
}
}
List<object> ParseArray() {
List<object> array = new List<object>();
// ditch opening bracket
json.Read();
// [
var parsing = true;
while (parsing) {
TOKEN nextToken = NextToken;
switch (nextToken) {
case TOKEN.NONE:
return null;
case TOKEN.COMMA:
continue;
case TOKEN.SQUARED_CLOSE:
parsing = false;
break;
default:
object value = ParseByToken(nextToken);
array.Add(value);
break;
}
}
return array;
}
object ParseValue() {
TOKEN nextToken = NextToken;
return ParseByToken(nextToken);
}
object ParseByToken(TOKEN token) {
switch (token) {
case TOKEN.STRING:
return ParseString();
case TOKEN.NUMBER:
return ParseNumber();
case TOKEN.CURLY_OPEN:
return ParseObject();
case TOKEN.SQUARED_OPEN:
return ParseArray();
case TOKEN.TRUE:
return true;
case TOKEN.FALSE:
return false;
case TOKEN.NULL:
return null;
default:
return null;
}
}
string ParseString() {
StringBuilder s = new StringBuilder();
char c;
// ditch opening quote
json.Read();
bool parsing = true;
while (parsing) {
if (json.Peek() == -1) {
parsing = false;
break;
}
c = NextChar;
switch (c) {
case '"':
parsing = false;
break;
case '\\':
if (json.Peek() == -1) {
parsing = false;
break;
}
c = NextChar;
switch (c) {
case '"':
case '\\':
case '/':
s.Append(c);
break;
case 'b':
s.Append('\b');
break;
case 'f':
s.Append('\f');
break;
case 'n':
s.Append('\n');
break;
case 'r':
s.Append('\r');
break;
case 't':
s.Append('\t');
break;
case 'u':
var hex = new char[4];
for (int i=0; i< 4; i++) {
hex[i] = NextChar;
}
s.Append((char) Convert.ToInt32(new string(hex), 16));
break;
}
break;
default:
s.Append(c);
break;
}
}
return s.ToString();
}
object ParseNumber() {
string number = NextWord;
if (number.IndexOf('.') == -1) {
long parsedInt;
Int64.TryParse(number, out parsedInt);
return parsedInt;
}
double parsedDouble;
Double.TryParse(number, out parsedDouble);
return parsedDouble;
}
void EatWhitespace() {
while (Char.IsWhiteSpace(PeekChar)) {
json.Read();
if (json.Peek() == -1) {
break;
}
}
}
char PeekChar {
get {
return Convert.ToChar(json.Peek());
}
}
char NextChar {
get {
return Convert.ToChar(json.Read());
}
}
string NextWord {
get {
StringBuilder word = new StringBuilder();
while (!IsWordBreak(PeekChar)) {
word.Append(NextChar);
if (json.Peek() == -1) {
break;
}
}
return word.ToString();
}
}
TOKEN NextToken {
get {
EatWhitespace();
if (json.Peek() == -1) {
return TOKEN.NONE;
}
switch (PeekChar) {
case '{':
return TOKEN.CURLY_OPEN;
case '}':
json.Read();
return TOKEN.CURLY_CLOSE;
case '[':
return TOKEN.SQUARED_OPEN;
case ']':
json.Read();
return TOKEN.SQUARED_CLOSE;
case ',':
json.Read();
return TOKEN.COMMA;
case '"':
return TOKEN.STRING;
case ':':
return TOKEN.COLON;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '-':
return TOKEN.NUMBER;
}
switch (NextWord) {
case "false":
return TOKEN.FALSE;
case "true":
return TOKEN.TRUE;
case "null":
return TOKEN.NULL;
}
return TOKEN.NONE;
}
}
}
/// <summary>
/// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string
/// </summary>
/// <param name="json">A Dictionary&lt;string, object&gt; / List&lt;object&gt;</param>
/// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns>
public static string Serialize(object obj) {
return Serializer.Serialize(obj);
}
sealed class Serializer {
StringBuilder builder;
Serializer() {
builder = new StringBuilder();
}
public static string Serialize(object obj) {
var instance = new Serializer();
instance.SerializeValue(obj);
return instance.builder.ToString();
}
void SerializeValue(object value) {
IList asList;
IDictionary asDict;
string asStr;
if (value == null) {
builder.Append("null");
} else if ((asStr = value as string) != null) {
SerializeString(asStr);
} else if (value is bool) {
builder.Append((bool) value ? "true" : "false");
} else if ((asList = value as IList) != null) {
SerializeArray(asList);
} else if ((asDict = value as IDictionary) != null) {
SerializeObject(asDict);
} else if (value is char) {
SerializeString(new string((char) value, 1));
} else {
SerializeOther(value);
}
}
void SerializeObject(IDictionary obj) {
bool first = true;
builder.Append('{');
foreach (object e in obj.Keys) {
if (!first) {
builder.Append(',');
}
SerializeString(e.ToString());
builder.Append(':');
SerializeValue(obj[e]);
first = false;
}
builder.Append('}');
}
void SerializeArray(IList anArray) {
builder.Append('[');
bool first = true;
foreach (object obj in anArray) {
if (!first) {
builder.Append(',');
}
SerializeValue(obj);
first = false;
}
builder.Append(']');
}
void SerializeString(string str) {
builder.Append('\"');
char[] charArray = str.ToCharArray();
foreach (var c in charArray) {
switch (c) {
case '"':
builder.Append("\\\"");
break;
case '\\':
builder.Append("\\\\");
break;
case '\b':
builder.Append("\\b");
break;
case '\f':
builder.Append("\\f");
break;
case '\n':
builder.Append("\\n");
break;
case '\r':
builder.Append("\\r");
break;
case '\t':
builder.Append("\\t");
break;
default:
int codepoint = Convert.ToInt32(c);
if ((codepoint >= 32) && (codepoint <= 126)) {
builder.Append(c);
} else {
builder.Append("\\u");
builder.Append(codepoint.ToString("x4"));
}
break;
}
}
builder.Append('\"');
}
void SerializeOther(object value) {
// NOTE: decimals lose precision during serialization.
// They always have, I'm just letting you know.
// Previously floats and doubles lost precision too.
if (value is float) {
builder.Append(((float) value).ToString("R"));
} else if (value is int
|| value is uint
|| value is long
|| value is sbyte
|| value is byte
|| value is short
|| value is ushort
|| value is ulong) {
builder.Append(value);
} else if (value is double
|| value is decimal) {
builder.Append(Convert.ToDouble(value).ToString("R"));
} else {
SerializeString(value.ToString());
}
}
}
}
}

Просмотреть файл

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: dddcdfc10fe074907ba122689b3b8c3e
timeCreated: 1451413795
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,73 @@
THIRD-PARTY SOFTWARE NOTICES AND INFORMATION
Microsoft is offering you a license to use the following components included within the Microsoft Azure Mobile SDK subject to the terms of the Microsoft software license terms for the Microsoft Azure Mobile SDK. These notices below are provided for informational purposes only and are not the license terms under which Microsoft distributes these files. Microsoft reserves all rights not expressly granted herein.
1. Darktable - MiniJSON (https://gist.github.com/darktable/1411710)
2. DotNetZip (http://dotnetzip.codeplex.com/)
%% Darktable - MiniJSON NOTICES AND INFORMATION BEGIN HERE
=========================================
Copyright (c) 2013 Calvin Rien
Based on the JSON parser by Patrick van Bergen
http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html
Simplified it so that it doesn't throw exceptions
and can be used in Unity iPhone with maximum code stripping.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
=========================================
END OF Darktable - MiniJSON NOTICES AND INFORMATION
%% DotNetZip NOTICES AND INFORMATION BEGIN HERE
=========================================
Microsoft Public License (Ms-PL)
This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.
1. Definitions
The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.
A "contribution" is the original software, or any additions or changes to the software.
A "contributor" is any person that distributes its contribution under this license.
"Licensed patents" are a contributor's patent claims that read directly on its contribution.
2. Grant of Rights
(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
3. Conditions and Limitations
(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
=========================================
END OF DotNetZip NOTICES AND INFORMATION

Просмотреть файл

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 4a01d7f6091cb4e98bfa452cb660e48f
folderAsset: yes
timeCreated: 1447678557
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,43 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
/**
* Provider for the Apple IDFA.
*
* This class must be integrated into your project whether you want Engagement to collect the IDFA or not. By default,
* this class will return the actual
* advertising identifier (on iOS 6+) using the AdSupport framework. This can be disabled by adding the preprocessor
* macro named `ENGAGEMENT_DISABLE_IDFA`.
*
*/
@interface AEIdfaProvider : NSObject
/**
* The singleton instance of the IDFA provider.
*
* @return a shared instance of `AEIdfaProvider`.
*/
+ (id)shared;
/**
* Check if IDFA reporting is enabled and ad tracking is enabled or not.
*
* @return A Boolean NSNumber that indicates whether the user has limited ad tracking or nil
* if IDFA reporting is not enabled.
*/
- (NSNumber*)isIdfaEnabled;
/* Return the identifier for advertisers or nil if not enabled/available. */
/**
* Get the advertising identifier UUID value.
*
* @return the value of the advertising identifier or nil if ad tracking is disabled
* or IDFA collection is disabled.
*/
- (NSString*)idfa;
@end

Просмотреть файл

@ -0,0 +1,16 @@
fileFormatVersion: 2
guid: 887feca3f68fd49c5947c74979c4fa0b
timeCreated: 1451063230
licenseType: Free
PluginImporter:
serializedVersion: 1
iconMap: {}
executionOrder: {}
isPreloaded: 0
platformData:
Any:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,72 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import "AEIdfaProvider.h"
#import <AdSupport/AdSupport.h>
@implementation AEIdfaProvider
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark Singleton method
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ (id)shared
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark Public methods
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (NSNumber*)isIdfaEnabled
{
#ifndef ENGAGEMENT_DISABLE_IDFA
ASIdentifierManager* sharedManager = [self ASIdentifierManager];
if (sharedManager)
{
return [NSNumber numberWithBool:[sharedManager isAdvertisingTrackingEnabled]];
}
#endif
return nil;
}
- (NSString*)idfa
{
#ifndef ENGAGEMENT_DISABLE_IDFA
ASIdentifierManager* sharedManager = [self ASIdentifierManager];
if (sharedManager)
{
if ([sharedManager isAdvertisingTrackingEnabled])
{
return [[sharedManager advertisingIdentifier] UUIDString];
}
}
#endif
return nil;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark Private methods
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef ENGAGEMENT_DISABLE_IDFA
- (ASIdentifierManager*)ASIdentifierManager
{
Class ASIdentifierManagerClass = NSClassFromString(@"ASIdentifierManager");
if (ASIdentifierManagerClass)
{
return [ASIdentifierManagerClass sharedManager];
}
return nil;
}
#endif
@end

Просмотреть файл

@ -0,0 +1,16 @@
fileFormatVersion: 2
guid: d5d1efbd9a91f430499e2068b35a2786
timeCreated: 1451063230
licenseType: Free
PluginImporter:
serializedVersion: 1
iconMap: {}
executionOrder: {}
isPreloaded: 0
platformData:
Any:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,79 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT license. See License.txt in the project root for license information.
*/
#include <sys/types.h>
#include <sys/sysctl.h>
#import <objc/runtime.h>
#import <objc/message.h>
#if ENGAGEMENT_UNITY != 1
#error message("EngagementPostBuild.CS has not been executed - check your Engagement.package installation")
#endif
#include "../Classes/UnityAppController.h"
@implementation UnityAppController(Engagement)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
- (void)application:(UIApplication *)application engagementDidReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
id instance =[NSClassFromString(@"EngagementShared") performSelector:NSSelectorFromString(@"instance")];
[instance performSelector:NSSelectorFromString(@"didReceiveRemoteNotification:fetchCompletionHandler:") withObject:userInfo withObject:handler];
// call the previous implementation (and not itself!)
[self application:application engagementDidReceiveRemoteNotification:userInfo fetchCompletionHandler:handler];
}
- (BOOL)application:(UIApplication*)application engagementDidFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
id instance =[NSClassFromString(@"EngagementUnity") performSelector:NSSelectorFromString(@"instance")];
[instance performSelector:NSSelectorFromString(@"registerApplication")];
// call the previous implementation (and not itself!)
return [self application:application engagementDidFinishLaunchingWithOptions:launchOptions];
}
#pragma clang diagnostic pop
// used in case the "parent" delegate was not implemented
- (void)application:(UIApplication *)application engagementEmpty:(id)_fake
{
}
+ (void)swizzleInstanceSelector:(SEL)originalSelector withNewSelector:(SEL)newSelector
{
Method originalMethod = class_getInstanceMethod(self, originalSelector);
Method newMethod = class_getInstanceMethod(self, newSelector);
// if the original Method does not exist, replace it with an empty implementation
if (originalMethod==nil)
{
Method emptyMethod = class_getInstanceMethod(self, @selector(application:engagementEmpty:));
BOOL methodAdded = class_addMethod([self class],
originalSelector,
method_getImplementation(emptyMethod), // empty code
method_getTypeEncoding(newMethod)); // but keep signature
if (methodAdded==false)
NSLog( @"Failed to add method %@",NSStringFromSelector(originalSelector));
originalMethod = class_getInstanceMethod(self, originalSelector);
}
method_exchangeImplementations(originalMethod, newMethod);
}
+(void)load
{
[self swizzleInstanceSelector:@selector(application:didReceiveRemoteNotification:fetchCompletionHandler:)
withNewSelector:@selector(application:engagementDidReceiveRemoteNotification:fetchCompletionHandler:)];
[self swizzleInstanceSelector:@selector(application:didFinishLaunchingWithOptions:)
withNewSelector:@selector(application:engagementDidFinishLaunchingWithOptions:)];
}
@end

Просмотреть файл

@ -0,0 +1,16 @@
fileFormatVersion: 2
guid: 2a73a3efe742d4c438607445c4fac64c
timeCreated: 1450537501
licenseType: Free
PluginImporter:
serializedVersion: 1
iconMap: {}
executionOrder: {}
isPreloaded: 0
platformData:
Any:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,16 @@
fileFormatVersion: 2
guid: 896d9717b92d6496e811a9c02b565b1e
timeCreated: 1450537879
licenseType: Free
PluginImporter:
serializedVersion: 1
iconMap: {}
executionOrder: {}
isPreloaded: 0
platformData:
Any:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: a8d40ff4de581496d9fe657b199c4ca1
folderAsset: yes
timeCreated: 1449063468
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,16 @@
fileFormatVersion: 2
guid: 172744131054d4d3896cc1661a792028
timeCreated: 1450461354
licenseType: Free
PluginImporter:
serializedVersion: 1
iconMap: {}
executionOrder: {}
isPreloaded: 0
platformData:
Any:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,16 @@
fileFormatVersion: 2
guid: 75b66adc109a84c07a0f3b821133bc2d
timeCreated: 1450461354
licenseType: Free
PluginImporter:
serializedVersion: 1
iconMap: {}
executionOrder: {}
isPreloaded: 0
platformData:
Any:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,16 @@
fileFormatVersion: 2
guid: 55ee99498e2654b3a9e870a49877e520
timeCreated: 1450461354
licenseType: Free
PluginImporter:
serializedVersion: 1
iconMap: {}
executionOrder: {}
isPreloaded: 0
platformData:
Any:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,56 @@
fileFormatVersion: 2
guid: dd3f139f1a7d44101ae0623d6f9e6c94
timeCreated: 1450461354
licenseType: Free
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 2
mipmaps:
mipMapMode: 0
enableMipMap: 1
linearTexture: 0
correctGamma: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: .25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 0
cubemapConvolution: 0
cubemapConvolutionSteps: 8
cubemapConvolutionExponent: 1.5
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: -1
mipBias: -1
wrapMode: -1
nPOTScale: 1
lightmap: 0
rGBM: 0
compressionQuality: 50
allowsAlphaSplitting: 0
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: .5, y: .5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaIsTransparency: 0
textureType: -1
buildTargetSettings: []
spriteSheet:
sprites: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,43 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "AEContentViewController.h"
#import "AEReachAnnouncement.h"
@class AEReachAnnouncement;
/**
* Abstract view controller displaying a Engagement announcement.
*
* By inheriting from this class you can create your own view controller to display announcements.
* If you plan to display Web announcements using this controller, make sure to use an object of type
* AEWebAnnouncementJsBridge
* as a delegate to your `UIWebView`.
*/
@interface AEAnnouncementViewController : AEContentViewController
/**
* Init the view controller with the given announcement.
* Subclasses should re-implement this method.
* @param anAnnouncement Announcement to display
*/
- (instancetype)initWithAnnouncement:(AEReachAnnouncement*)anAnnouncement;
/**
* Report the announcement as actioned and dismiss this view controller.
* Should be called by subclasses when the user clicks on the 'action' button associated to
* the announcement.
*/
- (void)action;
/**
* Use this property to store announcement information when the <initWithAnnouncement:>
* method is called.
* Subclasses should also read this property to init their subviews.
*/
@property(nonatomic, retain) AEReachAnnouncement* announcement;
@end

Просмотреть файл

@ -0,0 +1,38 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
/**
* A view intended to be presented on the current application window.
*
* Inside a window, only the first subview gets rotation events. To get around this problem,
* this view listen to device orientation changes and resize + apply the proper transform on the view.
*
* This view can be used as a container to another view by using the initialization method <initWithContent:>
* or it can be used as a replacement to the `UIView` class.
*/
@interface AEAutorotateView : UIView {
@private
UIView* _view;
UIInterfaceOrientation _orientation;
}
/**
* Initialize the view by using a child content.
* This view will just be used as a wrapper to the provided view.
* @param view The view to wrap.
*/
- (id)initWithContent:(UIView*)view;
/**
* Transform to apply on the view based on the current device orientation.
* The default implementation will return an affine transformation matrix constructed from the provided orientation.<br>
* @param orientation Orientation that will be applied.
* @result The new `CGAffineTransform` to apply on this view.
*/
- (CGAffineTransform)transformForOrientation:(UIInterfaceOrientation)orientation;
@end

Просмотреть файл

@ -0,0 +1,62 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class AEInteractiveContent;
/**
* Abstract view controller used to display an announcement or a poll.
*/
@interface AEContentViewController : UIViewController
/**
* Return the displayed content. Subclasses must override this method.
* @result The associated content.
*/
- (AEInteractiveContent*)content;
/**
* Report content as exited and dimiss this view controller.
* Should be called by subclasses when the user clicks on the _exit_ button associated to
* the announcement or poll.
*/
- (void)exit;
/**
* Load a button toolbar used by poll and announcement views.
* @param toolbar The native toolbar to load.
*/
- (void)loadToolbar:(UIToolbar*)toolbar;
/**
* Method called when action button from a loaded toolbar has been clicked.
* Sub-classes must re-implement this method.
* @param sender The object that sent the action message.
*/
- (void)actionButtonClicked:(id)sender;
/**
* Method called when exit button from a loaded toolbar has been clicked.
* By default, this method will just call the <exit> method.
* @param sender The object that sent the action message.
*/
- (void)exitButtonClicked:(id)sender;
/**
* Method called when the action bar button item has been loaded.
* Sub-classes can reimplement this method to customize the style of the action button.
* @param actionButton The button used to action the campaign.
*/
- (void)actionButtonLoaded:(UIBarButtonItem*)actionButton;
/**
* Method called when the exit bar button item has been loaded.
* Sub-classes can reimplement this method to customize the style of the exit button.
* @param exitButton The button used to exit the campaign.
*/
- (void)exitButtonLoaded:(UIBarButtonItem*)exitButton;
@end

Просмотреть файл

@ -0,0 +1,39 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import "AEAnnouncementViewController.h"
#import "AEWebAnnouncementJsBridge.h"
@class AEAnnouncementViewController;
/**
* Default implementation of AEAnnouncementViewController.
*
* This view controller display an announcement using layout view named `AEDefaultAnnouncementView.xib`.<br>
* You can change the xib file to your needs as long as you keep view identifier and types.
*
* This class is using the Javascript bridge AEWebAnnouncementJsBridge to perform actions when
* a recognized Javascript function is called inside a web announcement.
*/
@interface AEDefaultAnnouncementViewController : AEAnnouncementViewController<AEWebAnnouncementActionDelegate>
/** Navigation bar displaying announcement's title */
@property(nonatomic, retain) IBOutlet UINavigationBar* titleBar;
/** Text announcement's content goes in this view. */
@property(nonatomic, retain) IBOutlet UITextView* textView;
/** Web announcement's content goes in this view. */
@property(nonatomic, retain) IBOutlet UIWebView* webView;
/** Toolbar containing action and exit buttons */
@property(nonatomic, retain) IBOutlet UIToolbar* toolbar;
/**
* Javascript bridge
*/
@property(nonatomic, retain) AEWebAnnouncementJsBridge* jsBridge;
@end

Просмотреть файл

@ -0,0 +1,178 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "AENotifier.h"
#define NOTIFICATION_AREA_VIEW_TAG 36822491
#define NOTIFICATION_ICON_TAG 1
#define NOTIFICATION_TITLE_TAG 2
#define NOTIFICATION_MESSAGE_TAG 3
#define NOTIFICATION_IMAGE_TAG 4
#define NOTIFICATION_BUTTON_TAG 5
#define NOTIFICATION_CLOSE_TAG 6
/**
*
* This is the default notifier used by <AEReachModule>.
*
* It will display a banner notification inside the current application window or in a dedicated view tag if it exists.
* By default the banner notification overlay will be presented at the bottom of the screen. If you prefer to display it
* at the top of screen,
* edit the provided _`AENotificationView.xib`_ and change the `AutoSizing` property of the main view so it can be kept
* at the top of its superview.
*
* # Some examples of custom notifiers based on this class #
*
* ** Using a different nib file: **
*
* #import "AEDefaultNotifier.h"
* @interface MyNotifier : AEDefaultNotifier
* @end
*
* @implementation MyNotifier
* -(NSString*)nibNameForCategory:(NSString*)category
* {
* return "MyNotificationView";
* }
* @end
*
* ** Creating the notification view programmatically: **
*
* #import "AEDefaultNotifier.h"
* @interface MyNotifier : AEDefaultNotifier
* @end
*
* @implementation MyNotifier
*
* -(UIView*)notificationViewForContent:(AEInteractiveContent*)content
* {
* UIView* notificationView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 250, 80)];
* notificationView.backgroundColor = [UIColor redColor];
*
* // Title
* UILabel* title = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 230, 30)];
* title.text = content.notificationTitle;
* [notificationView addSubview:title];
* [title release];
*
* // Notification button
* UIButton* button = [[UIButton alloc] initWithFrame:notificationView.frame];
* [button addTarget:self action:@selector(onNotificationActioned) forControlEvents:UIControlEventTouchDown];
* [notificationView addSubview:button];
* [button release];
*
* return [notificationView autorelease];
* }
* @end
*/
@interface AEDefaultNotifier : NSObject<AENotifier>
{
@private
UIImage* _notificationIcon;
AEInteractiveContent* _content;
UIView* _containerView;
}
/**
* Create a default notifier with a given notification icon.
* The default notification view AENotificationView will be used to display notifications.
* @param icon Notification icon.
*/
+ (id)notifierWithIcon:(UIImage*)icon;
/**
* This method is called when a view is requested to display notifications.<br>
* The default implementation of this class return `NotificationView`, the name of
* the xib file provided with the reach library.<br>
* Subclasses can reimplement this method to return another xib filename. The file must be inside the
* main application bundle and should only contain one view.
*
* @param category Associated category. Can be ignored if this notifier handles only one category.
* @result Nib name for the given category.
*/
- (NSString*)nibNameForCategory:(NSString*)category;
/**
* This method is called when a new notification view is requested for the given content.
* By default this method load the view from the nib returned by <nibNameForCategory:>,
* and prepare it by calling the method <prepareNotificationView:forContent:>.<br>
* Subclasses can override this method to create a custom view for the given content.
*
* @param content Content to be notified. You can use the methods <[AEInteractiveContent notificationTitle]>,
* <[AEInteractiveContent notificationMessage]>, <[AEInteractiveContent notificationIcon]>,
* <[AEInteractiveContent notificationCloseable]>, <[AEInteractiveContent notificationImage]> to prepare your view.
* @result View displaying the notification.
*/
- (UIView*)notificationViewForContent:(AEInteractiveContent*)content;
/**
* This function is called when the notification view must be prepared, e.g. change texts,
* icon etc... based on the specified content. This is the responsibility of this method to
* associate actions to the buttons. At this point the notification is not yet attached to the
* view hierarchy, so you can not have access to its superview.
*
* The provided custom view must contains the following subviews:
*
* - `UIImageView` with tag 1 to display the notification icon
* - `UILabel` with tag 2 to display the notification's title
* - `UILabel` with tag 3 to display the notification's message
* - `UIImageView` with tag 4 to display the additional notification image
* - `UIButton` with tag 5 used when the notification is 'actioned'
* - `UIButton` with tag 6 used when the notification is 'exited'
*
* @param content Content to be notified.
* @param view View used to display the notification.
*/
- (void)prepareNotificationView:(UIView*)view forContent:(AEInteractiveContent*)content;
/**
* This function is called when the notification view has been added to a window.
* By default, this method do nothing but subclasses can override this method to perform additional tasks
* associated with presenting the notification view.
* @param view View containing the notification.
*/
- (void)notificationViewDidAppear:(UIView*)view;
/**
* This function is called when the notification view has been removed from the view hierarchy.
* By default, this method do nothing but subclasses can override this method to perform additional tasks
* associated with hiding the notification view.
* @param view View containing the notification.
*/
- (void)notificationViewDidDisappear:(UIView*)view;
/**
* Animate the area notification view when it appears.
* Default implementation performs a fade-in animation.
* Subclasses can override this method to customize the animation.
* @param view View to animate.
*/
- (void)animateAreaNoticationView:(UIView*)view;
/**
* Animate the overlay notification view when it appears.
* Default implementation performs a vertical slide animation.
* Subclasses can override this method to customize the animation.
* @param view View to animate.
*/
- (void)animateOverlayNotificationView:(UIView*)view;
/**
* Called when the notification is actioned (example : when the user clicks on the notification).
* If you override the method <prepareNotificationView:forContent:>, be sure to map this method to one of your U.I.
* controls.
*/
- (void)onNotificationActioned;
/**
* Called when the notification is exited (example : when the close button is clicked).
* If you override the method <prepareNotificationView:forContent:>, be sure to map this method to one of your U.I.
* controls
*/
- (void)onNotificationExited;
@end

Просмотреть файл

@ -0,0 +1,36 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "AEPollViewController.h"
@class AEReachPoll;
/**
* Default implementation of <AEPollViewController>.
*
* This view controller display a poll using layout view named `AEDefaultPollView.xib`.<br>
* You can change the xib file to your needs as long as you keep view identifier and types.
*/
@interface AEDefaultPollViewController : AEPollViewController {
@private
BOOL _hasBody;
NSMutableDictionary* _selectedChoices;
}
/** Submit's button */
@property(nonatomic, retain) UIBarButtonItem* submitButton;
/** Navigation bar displaying poll's title */
@property(nonatomic, retain) IBOutlet UINavigationBar* titleBar;
/** Table view responsible for displaying questions and choices */
@property(nonatomic, retain) IBOutlet UITableView* tableView;
/** Toolbar containing action and exit buttons */
@property(nonatomic, retain) IBOutlet UIToolbar* toolbar;
@end

Просмотреть файл

@ -0,0 +1,111 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <UIKit/UIKit.h>
#import "AEReachContent.h"
/**
* Reach content behavior.
*/
typedef NS_ENUM (NSInteger, AEContentBehavior)
{
/** A reach content that can be displayed at any time. */
AEContentBehaviorAnyTime = 1,
/** A reach content that can be displayed only when the application is in background. */
AEContentBehaviorBackground = 2,
/** A reach content that can be displayed during application session time. */
AEContentBehaviorSession = 3,
};
/**
* Abstract class for reach contents that can be displayed to the end-user.
*/
@interface AEInteractiveContent : AEReachContent
{
@private
NSString* _title;
NSString* _actionLabel;
NSString* _exitLabel;
NSMutableArray* _allowedActivities;
AEContentBehavior _behavior;
NSString* _notificationTitle;
NSString* _notificationMessage;
BOOL _notificationIcon;
BOOL _notificationCloseable;
NSString* _notificationImageString;
UIImage* _notificationImage;
BOOL _notificationDisplayed;
BOOL _notificationActioned;
BOOL _contentDisplayed;
BOOL _notifiedFromNativePush;
}
/**
* Test if this content can be notified in the current UI context.
* @param activity Current activity name, null if no current activity.
* @result YES if this content can be notified in the current UI context.
*/
- (BOOL)canNotify:(NSString*)activity;
/** Report notification has been displayed */
- (void)displayNotification;
/**
* Action the notification: this will display the announcement or poll, or will
* launch the action URL associated to the notification, depending of the content kind.
*/
- (void)actionNotification;
/**
* Action the notification: this will display the announcement or poll, or will
* launch the action URL associated to the notification, depending of the content kind.
* @param launchAction YES to launch associated action, NO to just report the notification action.
*/
- (void)actionNotification:(BOOL)launchAction;
/** Exit this notification. */
- (void)exitNotification;
/** Report content has been displayed */
- (void)displayContent;
/** Set is displayed value */
- (void)setDisplayed:(BOOL)displayed;
/** Set is actioned value */
- (void)setActioned:(BOOL)actioned;
/** Reach content's title */
@property(nonatomic, readonly) NSString* title;
/** The text label of the action button */
@property(nonatomic, readonly) NSString* actionLabel;
/** The text label of the exit button */
@property(nonatomic, readonly) NSString* exitLabel;
/** Reach content behavior (when to display the notification?) */
@property(readonly) AEContentBehavior behavior;
/** Notification's title */
@property(readonly) NSString* notificationTitle;
/** Notification's message */
@property(readonly) NSString* notificationMessage;
/** @result YES if the notification has a resource icon in notification content, NO otherwise */
@property(readonly) BOOL notificationIcon;
/** @result YES if the notification can be closed without looking at the content, NO otherwise */
@property(readonly) BOOL notificationCloseable;
/** @result notification image */
@property(readonly) UIImage* notificationImage;
/** @result YES if the content was notified from a native Apple Push Notification. */
@property BOOL notifiedFromNativePush;
@end

Просмотреть файл

@ -0,0 +1,45 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
/**
* A `AENotificationView` object represnts a view that is responsible for displaying reach notifications used by the
* default notifier <AEDefaultNotifier>.
*
* This view is using the layout named `AEDefaultNotificationView.xib`.
* You can change the xib file to your needs as long as you keep view identifier and types.<br>
* This class overrides the method `layoutSubviews` to move and resize subviews when some of them are hidden.
*/
@interface AENotificationView : UIView
{
@private
UILabel* _titleView;
UILabel* _messageView;
UIImageView* _iconView;
UIImageView* _imageView;
UIButton* _notificationButton;
UIButton* _closeButton;
}
/** Returns the title view of the notification. */
@property(nonatomic, readonly) UILabel* titleView;
/** Returns the message view of the notification. */
@property(nonatomic, readonly) UILabel* messageView;
/** Returns the icon view of the notification. */
@property(nonatomic, readonly) UIImageView* iconView;
/** Returns the image view of the notification. */
@property(nonatomic, readonly) UIImageView* imageView;
/** Returns the main button of the notification. */
@property(nonatomic, readonly) UIButton* notificationButton;
/** Returns the close button of the notification. */
@property(nonatomic, readonly) UIButton* closeButton;
@end

Просмотреть файл

@ -0,0 +1,36 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import "AEInteractiveContent.h"
/**
* Custom notifier specification.
*
* You can define how a content notification is done for a set of categories by implementing this
* protocol and registering your instances by calling <[AEReachModule registerNotifier:forCategory:]><br/>
* It is recommended to extend the default implementation: <AEDefaultNotifier> which
* performs most of the work and has convenient callbacks.
*/
@protocol AENotifier <NSObject>
@required
/**
* Handle a notification for a content.
* @param content content to be notified.
* @result YES to accept the content, NO to postpone the content (like overlay disabled in a
* specific context).
*/
- (BOOL)handleNotification:(AEInteractiveContent*)content;
/**
* Reach module needs to control notification appearance.
* When this method is called the notifier should clear any displayed notification for the given category.
* @param category the category to clear. This parameter can be ignored if the notifier handles only one kind of
* category.
*/
- (void)clearNotification:(NSString*)category;
@end

Просмотреть файл

@ -0,0 +1,39 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import "AEContentViewController.h"
@class AEReachPoll;
/**
* Abstract view controller displaying a Engagement poll.
*
* By inheriting from this class you can create your own view controller to display polls.
*/
@interface AEPollViewController : AEContentViewController
/**
* Init the view controller with the given poll.
* Subclasses should re-implement this method.
* @param poll Poll to display
*/
- (instancetype)initWithPoll:(AEReachPoll*)poll;
/**
* Submit answers for the associated poll and dismiss this view controller.<br>
* Dictionary keys must be the question ids and values must be the associated choice ids.
* Should be called by subclasses when the user clicks on the 'action' button associated to
* the poll.
* @param answers The poll answers to submit.
*/
- (void)submitAnswers:(NSDictionary*)answers;
/**
* Use this property to store poll information when the initWithPoll:
* method is called.
* Subclasses should also read this property to init their subviews.
*/
@property(nonatomic, retain) AEReachPoll* poll;
@end

Просмотреть файл

@ -0,0 +1,29 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import "AEInteractiveContent.h"
/** Announcement kind */
static NSString* const kAEAnnouncementKind = @"a";
/**
* The `AEReachAbstractAnnouncement` is a base class for all kind of announcements.
*/
@interface AEReachAbstractAnnouncement : AEInteractiveContent
{
}
/**
* Initialize an abstract announcement. Should only be called by subclasses.
* @param reachValues Parsed JSON reach values.
* @param params special parameters to replace in the action URL.
* @result An initialized abstract announcement or nil if it couldn't be parsed.
*/
- (id)initWithReachValues:(NSDictionary*)reachValues params:(NSDictionary*)params;
/** URL to launch as an action */
@property(nonatomic, retain) NSString* actionURL;
@end

Просмотреть файл

@ -0,0 +1,56 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import "AEReachAbstractAnnouncement.h"
/**
* Announcement's type.
*/
typedef NS_ENUM (NSInteger, AEAnnouncementType)
{
/** Unknwon announcement type */
AEAnnouncementTypeUnknown = -1,
/** Announcement with a text plain content */
AEAnnouncementTypeText = 1,
/** Announcement with an HTML content */
AEAnnouncementTypeHtml = 2
};
/**
* The `AEReachAnnouncement` class defines objects that represent generic Engagement announcements.
*
* You usually have to use this class when you implement your own
* announcement view controller.<br> The Engagement Reach SDK will instantiate your view controller using
* method <[AEAnnouncementViewController initWithAnnouncement:]>.
*/
@interface AEReachAnnouncement : AEReachAbstractAnnouncement {
@private
AEAnnouncementType _type;
NSDictionary* _cachedParams;
}
/**
* Parse an announcement
* @param reachValues Parsed reach values.
* @param params Special parameters to replace in the action URL and body of the announcement.
* @result A new announcement or nil if it couldn't be parsed.
*/
+ (id)announcementWithReachValues:(NSDictionary*)reachValues params:(NSDictionary*)params;
/**
* Get the mime type for this announcement. This is useful to interpret the text returned by
* #body.
*
* Possible values are:
*
* - `AEAnnouncementTypeUnknown`: Unknown announcement type
* - `AEAnnouncementTypeText`: A text announcement (associated mimetype is text/plain)
* - `AEAnnouncementTypeHtml`: An HTML announcement (associated mimetype is text/html)
*/
@property(readonly) AEAnnouncementType type;
@end

Просмотреть файл

@ -0,0 +1,141 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
/** If set, the notification has downloadable content */
static NSInteger FLAG_DLC_NOTIFICATION = 1;
/** If set, the clickable content exists */
static NSInteger FLAG_DLC_CONTENT = 2;
/** If set, both notification download and clickable content exists */
static NSInteger FLAG_DLC_NOTIF_AND_CONTENT = 3;
/**
* Abstract class for reach contents such as announcements and polls.
*/
@interface AEReachContent : NSObject
{
@private
NSUInteger _localId;
NSString* _category;
NSString* _body;
BOOL _processed;
BOOL _feedback;
NSDate* _expiryDate;
BOOL _expiryLocaltz;
NSString* _actionURL;
NSInteger _dlc;
NSString* _dlcId;
BOOL _dlcCompleted;
NSString* _pushId;
}
/**
* Parse a reach content from a given xml element
* @param reachValues Parsed JSON reach payload
* @result The parsed reach content or nil if content couldn't be parsed.
*/
- (id)initWithReachValues:(NSDictionary*)reachValues;
/** The unique reach content identifier setter method. */
@property(nonatomic, copy) NSString* contentId;
/** The unique push identifier setter method. */
@property(nonatomic, copy) NSString* pushId;
/** Local storage identifier */
@property(assign) NSUInteger localId;
/**
* Category of this content. You usually don't need to read this value by yourself.
* Instead, you should use the method <[AEReachModule registerAnnouncementController:forCategory:]>
* or <[AEReachModule registerPollController:forCategory:]> to tell the reach module
* which controller to display for a given category.
*/
@property(nonatomic, copy) NSString* category;
/** Reach content's body */
@property(nonatomic, copy) NSString* body;
/** Feedback required ? */
@property BOOL feedback;
/** URL to launch as an action */
@property(nonatomic, retain) NSString* actionURL;
/** The reach kind of this content, it match naming used by reach feedbacks */
- (NSString*)kind;
/** Drop content. */
- (void)drop;
/** Report content has been actioned. */
- (void)actionContent;
/** Report content has been exited. */
- (void)exitContent;
/** @result YES if content is expired and should be dropped, NO otherwise */
- (BOOL)isExpired;
/**
* Utility method to decode base64 data.
* @param str The string to decode.
*/
- (NSData*)decodeBase64:(NSString*)str;
/**
* Send feedback to reach about this content.
* @param status The feedback status.
* @param extras Extra information like poll answers.
*/
- (void)sendFeedback:(NSString*)status extras:(NSDictionary*)extras;
/**
* Send content reply to the service that sent it, after that new contents can be notified.
* @param status The feedback status.
* @param extras Extra information like poll answers.
*/
- (void)process:(NSString*)status extras:(NSDictionary*)extras;
/**
* Set or update payload.
* @param payload New payload.
*/
- (void)setPayload:(NSDictionary*)payload;
/** Return true if download is needed */
- (BOOL)hasDLC;
/** Return true if download is needed after notification is clicked */
- (BOOL)hasContentDLC;
/** Return true if download is needed to display notification */
- (BOOL)hasNotificationDLC;
/** Return true if download is needed to display notification(this notification also has content to be shown after click) */
- (BOOL)hasNotificationAndContentDLC;
/**
* Check if DLC completed.
* @return true if DLC completed.
*/
- (BOOL)isDlcCompleted;
/**
* Return dlc Id.
* @return dlc Id.
*/
- (NSString*)getDlcId;
/**
* Return unique push Id.
* @return pushId.
*/
- (NSString*)getPushId;
@end

Просмотреть файл

@ -0,0 +1,65 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import "AEReachContent.h"
/**
* Data push's type.
*/
typedef NS_ENUM (NSInteger, AEDatapushType)
{
/** Unknwon data-push type */
AEDatapushTypeUnknown = -1,
/** Data-push with a text content */
AEDatapushTypeText = 1,
/** Data-push with a base 64 encoded content */
AEDatapushTypeBase64 = 2
};
/** Datapush kind */
static NSString* const kAEDatapushKind = @"d";
/**
* The `AEReachDataPush` class defines objects that represent a generic reach content.
*/
@interface AEReachDataPush : AEReachContent
{
@private
AEDatapushType _type;
NSDictionary* _cachedParams;
}
/**
* Parse an announcement
* @param reachValues Parsed reach values.
* @param params special parameters to replace in the body of the datapush.
* @result A new announcement or nil if it couldn't be parsed.
*/
+ (id)datapushWithReachValues:(NSDictionary*)reachValues params:(NSDictionary*)params;
/**
* Intialize data push.
* @param reachValues Parsed reach values.
* @param params special parameters to replace in the body of the datapush.
* @result A new announcement or nil if it couldn't be parsed.
*/
- (id)initWithReachValues:(NSDictionary*)reachValues params:(NSDictionary*)params;
/**
* Get the type for this data push.
*
* Possible values are:
*
* - `AEDatapushTypeUnknown`: Unknown data push type
* - `AEDatapushTypeText`: A text data push
* - `AEDatapushTypeBase64`: A base 64 data push
*/
@property(readonly) AEDatapushType type;
/** Get decoded body. Only apply on base 64 data pushes (return `nil` for other types). */
@property(readonly) NSData* decodedBody;
@end

Просмотреть файл

@ -0,0 +1,38 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
/**
* The `AEReachDataPushDelegate` protocol defines methods a delegate of <AEReachModule> should implement to receive data
* pushes.
*
* To process data push, you must implement method <onDataPushBase64ReceivedWithDecodedBody:andEncodedBody:>
* if it's a file upload or a base64 data, otherwise you implement <onDataPushStringReceived:>.<br>
* To use it in your application just call the method <[AEReachModule dataPushDelegate]> after module
* initialization.
*/
@protocol AEReachDataPushDelegate <UIAlertViewDelegate>
@optional
/**
* This function is called when a datapush of type text has been received.
* @param category short string describing your data to push
* @param body Your content.
* @result YES to acknowledge the content, NO to cancel.
**/
- (BOOL)didReceiveStringDataPushWithCategory:(NSString*)category body:(NSString*)body;
/**
* This function is called when a datapush of type base64 has been received.
* @param category short string describing your data to push
* @param decodedBody Your base64 content decoded.
* @param encodedBody Your base64 content encoded.
* @result YES to acknowledge the content, NO to cancel.
**/
- (BOOL)didReceiveBase64DataPushWithCategory:(NSString*)category decodedBody:(NSData*)decodedBody encodedBody:(NSString*)
encodedBody;
@end

Просмотреть файл

@ -0,0 +1,189 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "AEModule.h"
#import "AEReachDataPushDelegate.h"
#import "AENotifier.h"
@class AEStorage;
@class AEContentViewController;
/* Export module name */
extern NSString* const kAEReachModuleName;
/* Export reach xml namespace */
extern NSString* const kAEReachNamespace;
/* Export reach default category */
extern NSString* const kAEReachDefaultCategory;
/* Reach module state */
typedef enum _AEReachModuleState
{
AEReachModuleStateIdle = 1,
AEReachModuleStateNotifying = 2,
AEReachModuleStateLoading = 3,
AEReachModuleStateShowing = 4
} AEReachModuleState;
/**
* The Reach Engagement module
*
* This is the module that manage reach functionalities. It listens push messages thanks to
* <[AEModule pushMessageReceived:]> and <[AEModule displayPushMessageNotification:]> and notify the user
* about announcements and polls.<br>
* You usually create the module using the method moduleWithNotificationIcon: and pass it when you initialize Engagement
* (using method <[EngagementAgent init:modules:]>)
*
* *Example of a basic integration:*
*
* - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
* AEReachModule* reach = [AEReachModule moduleWithNotificationIcon:[UIImage imageNamed:@"icon.png"]];
* [EngagementAgent init:@"Endpoint={YOUR_APP_COLLECTION.DOMAIN};SdkKey={YOUR_APPID};AppId={YOUR_APPID}"
*modules:reach, nil];
*
* ...
*
* return YES;
* }
*
*/
@interface AEReachModule : NSObject<AEModule>
{
@private
/* Storage */
AEStorage* _db;
AEStorage* _feedbackDb;
/* Background/Inactive state tracking */
BOOL _didEnterBackground;
BOOL _willResignActive;
BOOL _willEnterForeground;
BOOL _applicationDidLaunch;
BOOL _applicationLaunchedViaSystemPush;
/* Set of DLCs that are pending download (key = localId) */
NSMutableIndexSet* _pendingDlcs;
/* Cached Reach Values */
NSDictionary* _cachedReachValues;
/* Entries scheduled to be removed */
NSMutableIndexSet* _trash;
/* Scanning db storage context */
BOOL _scanning;
/* Current state */
AEReachModuleState _state;
/** The message identifier being processed */
NSInteger _processingId;
/* Current activity */
NSString* _currentActivity;
/* Announcement controller classes by category */
NSMutableDictionary* _announcementControllers;
/* Poll controller classes by category */
NSMutableDictionary* _pollControllers;
/* Notification handlers by category */
NSMutableDictionary* _notifiers;
/* Special parameters to inject in announcement's action url and body */
NSDictionary* _params;
/* Remember if the agent has been started or not */
BOOL _isStarted;
/* Data push delegate */
id<AEReachDataPushDelegate> _dataPushDelegate;
/* Current displayed controller */
AEContentViewController* _displayedController;
/* Auto badge */
BOOL _autoBadgeEnabled;
BOOL _badgeNotificationReceived;
/* Maximum number of contents */
NSUInteger _maxContents;
}
/**
* Instantiate a new reach Engagement module.
* @param icon The image to use as the notification icon
*/
+ (id)moduleWithNotificationIcon:(UIImage*)icon;
/**
* Enable or disable automatic control of the badge value. If enabled, the Reach module will automatically
* clear the application badge and also reset the value stored by Engagement every time the application
* is started or foregrounded.
* @param enabled YES to enable auto badge, NO otherwise (Disabled by default).
*/
- (void)setAutoBadgeEnabled:(BOOL)enabled;
/**
* Set the maximum number of in-app campaigns that can be displayed.
* @param maxCampaigns The maximum number of in-app campaigns that can be displayed (0 to disable in-app campaigns).
*/
- (void)setMaxInAppCampaigns:(NSUInteger)maxCampaigns;
/**
* Register an announcement category.
* @param category The name of the category to map.
* @param clazz The associated view controller class to instantiate when an announcement of the given
* category is received. The controller class should inherit from <AEAnnouncementViewController>.
*/
- (void)registerAnnouncementController:(Class)clazz forCategory:(NSString*)category;
/**
* Register a poll category.
* @param category The name of the category to map.
* @param clazz The associated view controller class to instantiate when an poll of the given
* category is received. The controller class should inherit from <AEPollViewController>.
*/
- (void)registerPollController:(Class)clazz forCategory:(NSString*)category;
/**
* Register a notifier for a given category.
* @param notifier Notifier to register for a category.
* @param category The name of the category.
*/
- (void)registerNotifier:(id<AENotifier>)notifier forCategory:(NSString*)category;
/**
* Mark given content processed. It will be removed from cache,
* and any other waiting contents will be displayed to the user.
* @param content The content to mark as processed.
*/
- (void)markContentProcessed:(AEReachContent*)content;
/**
* Called when loading page is dismissed by user.
*/
- (void)onLoadingViewDismissed;
/**
* Called when a notification is actioned.
* @param content The content associated to the notification.
*/
- (void)onNotificationActioned:(AEReachContent*)content;
/**
* Indicate if feedback with status code should be sent for a push message.
* This method queries the db and updates the db at the same time.
* @param The flag indicating if feedback should be sent or not.
*/
- (BOOL)shouldSendFeedback:(NSString*)status forPushId:(NSString*)pushId;
/** The delegate that will handle data pushes. */
@property(nonatomic, retain) id<AEReachDataPushDelegate> dataPushDelegate;
@end

Просмотреть файл

@ -0,0 +1,25 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import "AEReachAbstractAnnouncement.h"
/**
* The `AEReachNotifAnnouncement` class defines objects that represent a Engagement _notification only_ announcement.
*
* This is a special announcement used when you just want to display the notification (application banner or apple
* push).
* When the user clicks on the notification, the action url is launched, and the announcement is acknownledged.
*/
@interface AEReachNotifAnnouncement : AEReachAbstractAnnouncement
/**
* Parse a notif announcement
* @param reachValues Parsed reach values.
* @param params special parameters to replace in the action URL.
* @result A new notif announcement or nil if it couldn't be parsed.
*/
+ (id)notifAnnouncementWithReachValues:(NSDictionary*)reachValues params:(NSDictionary*)params;
@end

Просмотреть файл

@ -0,0 +1,48 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import "AEInteractiveContent.h"
/** Announcement kind */
static NSString* const kAEPollKind = @"p";
/**
* The `AEReachPoll` class defines objects that represent generic Engagement poll.
*
* You usually have to use this class when you implement your own poll
* view controller.
*
* **See also**
*
* - <AEPollViewController>
*/
@interface AEReachPoll : AEInteractiveContent {
@private
NSArray* _questions;
NSMutableDictionary* _answers;
}
/**
* Poll questions.<br>
* Contains <AEReachPollQuestion> objects.
*/
@property(readonly) NSArray* questions;
/**
* Parse a poll
* @param reachValues Parsed reach values.
* @result A new poll or nil if it couldn't be parsed.
*/
+ (id)pollWithReachValues:(NSDictionary*)reachValues;
/**
* Fill answer for a given question. Answers are sent when calling <[AEReachContent actionContent]>.
* @param qid Question id as specified in <[AEReachPollQuestion questionId]>.
* @param cid Choice id as specified in <[AEReachPollChoice choiceId]>.
* @see questions
*/
- (void)fillAnswerWithQuestionId:(NSString*)qid choiceId:(NSString*)cid;
@end

Просмотреть файл

@ -0,0 +1,65 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
/**
* The `AEReachPollQuestion` class defines objects that represent poll's questions
*/
@interface AEReachPollQuestion : NSObject {
@private
NSString* _questionId;
NSString* _title;
NSArray* _choices;
}
/**
* Create and return a poll's question.
* @param qId The unique identifier for the quetion.
* @param title The question's title.
* @param choices The question's choices.
*/
- (id)initWithId:(NSString*)qId title:(NSString*)title choices:(NSArray*)choices;
/** The unique question identifier */
@property(readonly) NSString* questionId;
/** Localized question text */
@property(readonly) NSString* title;
/**
* Choices.<br>
* Contains <AEReachPollChoice> objects
*/
@property(readonly) NSArray* choices;
@end
/**
* The `AEReachPollQuestion` class defines objects that represent poll's choices
*/
@interface AEReachPollChoice : NSObject {
@private
NSString* _choiceId;
NSString* _title;
BOOL _isDefault;
}
/**
* Create and return a question's choice.
* @param cId The unique identifier for the choice.
* @param title The choice's title.
* @param isDefault Is this the default choice for the associated question.
*/
- (id)initWithId:(NSString*)cId title:(NSString*)title isDefault:(BOOL)isDefault;
/** The unique choice identifier */
@property(readonly) NSString* choiceId;
/** The localized choice text */
@property(readonly) NSString* title;
/** YES if this choice is the default one for the associated question. */
@property(readonly) BOOL isDefault;
@end

Просмотреть файл

@ -0,0 +1,44 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
/**
* The `AEViewControllerUtil` provides utility methods to present and dismiss view controllers on screen.
*/
@interface AEViewControllerUtil : NSObject
/**
* Present the controller's view inside the key window using an optional vertical cover animation:
* The view slides up from the bottom of the screen.
* The given controller will be retained until method <dismissViewController:> is called.
* @param controller The view controller to present.
* @param animated If YES, animates the view; otherwise, does not.
*/
+ (void)presentViewController:(UIViewController*)controller animated:(BOOL)animated;
/**
* Dismiss the given view controller. Remove the view from it's parent using a vertical slide animation.
* The controller is released.
* @param controller The view controller to dismiss.
* @see dismissViewController:animated:
*/
+ (void)dismissViewController:(UIViewController*)controller;
/**
* Dismiss the given view controller.
* The controller is released.
* @param controller The view controller to dismiss
* @param animated If YES, animates the view; otherwise, does not.
* @see dismissViewController:
*/
+ (void)dismissViewController:(UIViewController*)controller animated:(BOOL)animated;
/**
* Get an available window for this application.
*/
+ (UIWindow*)availableWindow;
@end

Просмотреть файл

@ -0,0 +1,61 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol AEWebAnnouncementActionDelegate;
/**
*
* Javascript bridge used by web announcements.
*
* Create a bridge between javascript methods embed inside a web announcement and objective c methods
* defined in <AEWebAnnouncementActionDelegate>.<br>
* The mapping is as follow:
* - *engagementReachContent.actionContent()* is mapped to <[AEWebAnnouncementActionDelegate action]>
* - *engagementReachContent.exitContent()* is mapped to <[AEWebAnnouncementActionDelegate exit]>
*
* This class must be used in association with a `UIWebView`:
*
* [webView setDelegate:[AEWebAnnouncementJsBridge jsBridgeWithDelegate:self]];
*
*/
@interface AEWebAnnouncementJsBridge : NSObject<UIWebViewDelegate>
{
@private
id<AEWebAnnouncementActionDelegate> _delegate;
}
/**
* Create a bridge between Javascript functions and Objective C methods.<br>
* Used the returned object as a delegate to an existing `UIWebView`.
* @param delegate The delegate that will receive reach actions each time a recognized Javascript function is called.
*/
+ (id)jsBridgeWithDelegate:(id<AEWebAnnouncementActionDelegate>)delegate;
@end
/**
* The `AEWebAnnouncementActionDelegate` protocol defines the methods a delegate of a <AEWebAnnouncementJsBridge> object
* should implement.
*
* Each time a recognized Javascript method is called, the corresponding delegate method will be called.
* See methods definition for the list of recognized actions.
*/
@protocol AEWebAnnouncementActionDelegate <NSObject>
/**
* Mapped to the javascript function *engagementReachContent.actionContent()*<br>
* The announcement has been actioned.
*/
- (void)action;
/**
* Mapped to the javascript function *engagementReachContent.exitContent()*<br>
* The announcement has been exited.
*/
- (void)exit;
@end

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше