1.0.0
This commit is contained in:
Родитель
33bb21f083
Коммит
db0e42347d
|
@ -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.
|
Двоичный файл не отображается.
154
README.md
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
|
|
@ -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,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.
|
|
@ -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
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
|
@ -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};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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 &
|
|
@ -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
|
Двоичный файл не отображается.
|
@ -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
|
|
@ -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 "$@"
|
|
@ -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
|
|
@ -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'
|
||||
}
|
||||
|
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
Двоичные данные
src/Android/libEngagementUnity/src/main/res/drawable/engagement_close.png
Normal file
Двоичные данные
src/Android/libEngagementUnity/src/main/res/drawable/engagement_close.png
Normal file
Двоичный файл не отображается.
После Ширина: | Высота: | Размер: 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:
|
Двоичный файл не отображается.
|
@ -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:
|
Двоичный файл не отображается.
|
@ -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<object>, a Dictionary<string, object>, 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<string, object> / List<object></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
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче