aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-11-03 18:17:19 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-11-03 18:17:19 +0000
commitb209b793032132b1905f7d294062b77b010b3d7b (patch)
tree00e0f9517f22f9f9fc95aa6a242a072f9b188f09
parent3e0c54a916e01855da81de8f1f515527641f4bcb (diff)
parent686e56e5d1ff75c57e7cac565c0af8efc6055a57 (diff)
downloadwalt-android11-platform-release.tar.gz
Change-Id: Iaab113428c411702beaf26352ad0e3e3ce179f09
-rw-r--r--METADATA3
-rw-r--r--NOTICE202
-rw-r--r--OWNERS1
-rw-r--r--android/WALT/WALT.iml2
-rw-r--r--android/WALT/app/build.gradle77
-rw-r--r--android/WALT/app/src/main/AndroidManifest.xml6
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/AboutFragment.java6
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/AccelerometerFragment.java379
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/AudioFragment.java9
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/AutoRunFragment.java5
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/BaseUsbConnection.java8
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/CrashLogActivity.java3
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/DiagnosticsFragment.java3
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/DragLatencyFragment.java7
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/FastPathSurfaceView.java3
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/FrontPageFragment.java3
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/LogFragment.java9
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/LogUploader.java3
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/MainActivity.java50
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/MidiFragment.java3
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/NumberPickerPreference.java22
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/ScreenResponseFragment.java15
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/SettingsFragment.java29
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/SimpleLogger.java4
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/TapLatencyFragment.java7
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/TraceLogger.java16
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/UsMotionEvent.java9
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/Utils.java37
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/WaltDevice.java19
-rw-r--r--android/WALT/app/src/main/java/org/chromium/latency/walt/programmer/FirmwareImage.java8
-rw-r--r--android/WALT/app/src/main/jni/Android.bp38
-rw-r--r--android/WALT/app/src/main/jni/Android.mk27
-rw-r--r--android/WALT/app/src/main/jni/Application.mk2
-rw-r--r--android/WALT/app/src/main/res/drawable/ic_brightness_7_black_24dp.xml9
-rw-r--r--android/WALT/app/src/main/res/drawable/ic_chevron_left_black_24dp.xml9
-rw-r--r--android/WALT/app/src/main/res/drawable/ic_equalizer_black_24dp.xml9
-rw-r--r--android/WALT/app/src/main/res/drawable/ic_help_black_24dp.xml9
-rw-r--r--android/WALT/app/src/main/res/drawable/ic_import_export_black_24dp.xml9
-rw-r--r--android/WALT/app/src/main/res/drawable/ic_mic_black_24dp.xml9
-rw-r--r--android/WALT/app/src/main/res/drawable/ic_music_note_black_24dp.xml2
-rw-r--r--android/WALT/app/src/main/res/drawable/ic_settings_black_24dp.xml2
-rw-r--r--android/WALT/app/src/main/res/drawable/ic_system_update_alt_black_24dp.xml2
-rw-r--r--android/WALT/app/src/main/res/layout/activity_main.xml29
-rw-r--r--android/WALT/app/src/main/res/layout/dialog_upload.xml3
-rw-r--r--android/WALT/app/src/main/res/layout/fragment_accelerometer.xml80
-rw-r--r--android/WALT/app/src/main/res/layout/fragment_audio.xml14
-rw-r--r--android/WALT/app/src/main/res/layout/fragment_diagnostics.xml34
-rw-r--r--android/WALT/app/src/main/res/layout/fragment_drag_latency.xml18
-rw-r--r--android/WALT/app/src/main/res/layout/fragment_front_page.xml74
-rw-r--r--android/WALT/app/src/main/res/layout/fragment_midi.xml6
-rw-r--r--android/WALT/app/src/main/res/layout/fragment_screen_response.xml14
-rw-r--r--android/WALT/app/src/main/res/layout/fragment_tap_latency.xml12
-rw-r--r--android/WALT/app/src/main/res/layout/histogram.xml6
-rw-r--r--android/WALT/app/src/main/res/layout/line_chart.xml6
-rw-r--r--android/WALT/app/src/main/res/layout/toolbar.xml5
-rw-r--r--android/WALT/app/src/main/res/menu/menu_main.xml6
-rw-r--r--android/WALT/app/src/main/res/raw/walt.hex2671
-rw-r--r--android/WALT/app/src/main/res/values/dimens.xml1
-rw-r--r--android/WALT/app/src/main/res/values/strings.xml32
-rw-r--r--android/WALT/app/src/main/res/values/styles.xml3
-rw-r--r--android/WALT/app/src/main/res/xml/backup_rules.xml4
-rw-r--r--android/WALT/app/src/main/res/xml/preferences.xml26
-rw-r--r--android/WALT/app/src/test/java/org/chromium/latency/walt/AccelerometerFragmentTest.java60
-rw-r--r--android/WALT/app/src/test/java/org/chromium/latency/walt/HistogramChartTest.java2
-rw-r--r--android/WALT/app/src/test/java/org/chromium/latency/walt/TraceLoggerTest.java2
-rw-r--r--android/WALT/app/src/test/java/org/chromium/latency/walt/UtilsTest.java34
-rw-r--r--android/WALT/build.gradle8
-rw-r--r--android/WALT/gradle.properties4
-rw-r--r--android/WALT/gradle/wrapper/gradle-wrapper.jarbin53637 -> 54329 bytes
-rw-r--r--android/WALT/gradle/wrapper/gradle-wrapper.properties3
-rwxr-xr-xandroid/WALT/gradlew72
-rw-r--r--android/WALT/gradlew.bat14
-rw-r--r--arduino/walt/walt.ino29
-rw-r--r--docs/DragLatency.md11
-rw-r--r--docs/ScreenLatency.md4
-rw-r--r--docs/TapLatency.md4
-rw-r--r--docs/usage/WALT_usage.md8
-rw-r--r--hardware/WALT_schematic.pdfbin48278 -> 48712 bytes
-rw-r--r--pywalt/README.md18
-rw-r--r--pywalt/pywalt/walt.py2
80 files changed, 2462 insertions, 1932 deletions
diff --git a/METADATA b/METADATA
new file mode 100644
index 0000000..d97975c
--- /dev/null
+++ b/METADATA
@@ -0,0 +1,3 @@
+third_party {
+ license_type: NOTICE
+}
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index d645695..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/OWNERS b/OWNERS
index b74e8ca..32e40bf 100644
--- a/OWNERS
+++ b/OWNERS
@@ -3,3 +3,4 @@
alehmer@google.com
spfetsch@google.com
gkasten@google.com
+taikuo@google.com
diff --git a/android/WALT/WALT.iml b/android/WALT/WALT.iml
index 628d221..f8948c5 100644
--- a/android/WALT/WALT.iml
+++ b/android/WALT/WALT.iml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<module external.linked.project.id="WALT" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+<module external.linked.project.id="WALT" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="java-gradle" name="Java-Gradle">
<configuration>
diff --git a/android/WALT/app/build.gradle b/android/WALT/app/build.gradle
index 531142e..d3fd5ae 100644
--- a/android/WALT/app/build.gradle
+++ b/android/WALT/app/build.gradle
@@ -1,49 +1,54 @@
-apply plugin: 'com.android.model.application'
-
-model {
- android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
-
- defaultConfig {
- applicationId "org.chromium.latency.walt"
- minSdkVersion.apiLevel 17
- targetSdkVersion.apiLevel 23
- versionCode 8
- versionName "0.1.7"
- }
- ndk {
- moduleName "sync_clock_jni"
- CFlags.addAll "-I${project.rootDir}/app/src/main/jni".toString(), "-g", "-DUSE_LIBLOG", "-Werror"
- ldLibs.addAll "OpenSLES", "log"
- }
- buildTypes {
- release {
+apply plugin: 'com.android.application'
+
+
+android {
+ compileSdkVersion 29
+ buildToolsVersion '29.0.3'
+
+ defaultConfig {
+ applicationId "org.chromium.latency.walt"
+ minSdkVersion 21
+ targetSdkVersion 29
+ versionCode 9
+ versionName "0.1.9"
+ }
+
+ externalNativeBuild.ndkBuild {
+ path 'src/main/jni/Android.mk'
+ }
+
+ buildTypes {
+ release {
minifyEnabled false
- proguardFiles.add(file("proguard-rules.pro"))
- }
- debug {
- ndk {
- debuggable true
- }
+ }
+ debug {
+ ndk {
+ debuggable true
}
}
}
+
+ ndkVersion "21.0.6113669"
+
+ lintOptions {
+ abortOnError false
+ }
}
dependencies {
- compile 'com.android.support:appcompat-v7:25.1.0'
- compile 'com.android.support:design:25.1.0'
- compile 'com.android.support:preference-v7:25.1.0'
- compile 'com.android.support:preference-v14:25.1.0'
- compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
- testCompile 'junit:junit:4.12'
- testCompile 'org.mockito:mockito-core:1.10.19'
- testCompile ('org.powermock:powermock-api-mockito:1.6.2') {
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.preference:preference:1.1.1'
+ implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
+ implementation 'com.github.PhilJay:MPAndroidChart:v3.0.1'
+ implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
+ testImplementation 'junit:junit:4.13'
+ testImplementation 'org.mockito:mockito-core:1.10.19'
+ testImplementation ('org.powermock:powermock-api-mockito:1.6.6') {
exclude module: 'hamcrest-core'
exclude module: 'objenesis'
}
- testCompile ('org.powermock:powermock-module-junit4:1.6.2') {
+ testImplementation ('org.powermock:powermock-module-junit4:1.6.6') {
exclude module: 'hamcrest-core'
exclude module: 'objenesis'
}
diff --git a/android/WALT/app/src/main/AndroidManifest.xml b/android/WALT/app/src/main/AndroidManifest.xml
index 869b5e8..992d368 100644
--- a/android/WALT/app/src/main/AndroidManifest.xml
+++ b/android/WALT/app/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
package="org.chromium.latency.walt">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@@ -9,9 +10,12 @@
<application
android:allowBackup="true"
+ android:supportsRtl="true"
+ android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
- android:theme="@style/AppTheme">
+ android:theme="@style/AppTheme"
+ tools:ignore="LockedOrientationActivity">
<activity
android:name="org.chromium.latency.walt.MainActivity"
android:label="@string/app_name"
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/AboutFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/AboutFragment.java
index 08b4e4f..2dce815 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/AboutFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/AboutFragment.java
@@ -19,11 +19,13 @@ package org.chromium.latency.walt;
import android.os.Build;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
+import java.util.Locale;
+
+import androidx.fragment.app.Fragment;
/**
@@ -46,7 +48,7 @@ public class AboutFragment extends Fragment {
public void onResume() {
super.onResume();
TextView textView = (TextView) getActivity().findViewById(R.id.txt_build_info);
- String text = String.format("WALT v%s (versionCode=%d)\n",
+ String text = String.format(Locale.US, "WALT v%s (versionCode=%d)\n",
BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE);
text += "WALT protocol version: " + WaltDevice.PROTOCOL_VERSION + "\n";
text += "Android Build ID: " + Build.DISPLAY + "\n";
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/AccelerometerFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/AccelerometerFragment.java
new file mode 100644
index 0000000..4f39547
--- /dev/null
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/AccelerometerFragment.java
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.chromium.latency.walt;
+
+import static org.chromium.latency.walt.Utils.argmax;
+import static org.chromium.latency.walt.Utils.interp;
+import static org.chromium.latency.walt.Utils.max;
+import static org.chromium.latency.walt.Utils.mean;
+import static org.chromium.latency.walt.Utils.min;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.text.method.ScrollingMovementMethod;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.fragment.app.Fragment;
+
+import com.github.mikephil.charting.charts.ScatterChart;
+import com.github.mikephil.charting.components.Description;
+import com.github.mikephil.charting.data.Entry;
+import com.github.mikephil.charting.data.ScatterData;
+import com.github.mikephil.charting.data.ScatterDataSet;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+public class AccelerometerFragment extends Fragment implements
+ View.OnClickListener, SensorEventListener {
+
+ private static final int MAX_TEST_LENGTH_MS = 10000;
+ private SimpleLogger logger;
+ private WaltDevice waltDevice;
+ private TextView logTextView;
+ private View startButton;
+ private ScatterChart latencyChart;
+ private View latencyChartLayout;
+ private StringBuilder accelerometerData;
+ private List<AccelerometerEvent> phoneAccelerometerData = new ArrayList<>();
+ private Handler handler = new Handler();
+ private SensorManager sensorManager;
+ private Sensor accelerometer;
+ private double realTimeOffsetMs;
+ private boolean isTestRunning = false;
+
+ Runnable finishAccelerometer = new Runnable() {
+ @Override
+ public void run() {
+ isTestRunning = false;
+ waltDevice.stopListener();
+ waltDevice.clearTriggerHandler();
+ calculateAndDrawLatencyChart(accelerometerData.toString());
+ startButton.setEnabled(true);
+ accelerometerData = new StringBuilder();
+ LogUploader.uploadIfAutoEnabled(getContext());
+ }
+ };
+
+ private BroadcastReceiver logReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String msg = intent.getStringExtra("message");
+ AccelerometerFragment.this.appendLogText(msg);
+ }
+ };
+
+ private WaltDevice.TriggerHandler triggerHandler = new WaltDevice.TriggerHandler() {
+ @Override
+ public void onReceive(WaltDevice.TriggerMessage tmsg) {
+ logger.log("ERROR: Accelerometer trigger got a trigger message, " +
+ "this should never happen.");
+ }
+
+ @Override
+ public void onReceiveRaw(String s) {
+ if (s.trim().equals("end")) {
+ // Remove the delayed callback and run it now
+ handler.removeCallbacks(finishAccelerometer);
+ handler.post(finishAccelerometer);
+ } else {
+ accelerometerData.append(s);
+ }
+ }
+ };
+
+ Runnable startAccelerometer = new Runnable() {
+ @Override
+ public void run() {
+ waltDevice.setTriggerHandler(triggerHandler);
+ try {
+ waltDevice.command(WaltDevice.CMD_ACCELEROMETER);
+ } catch (IOException e) {
+ logger.log("Error sending command CMD_ACCELEROMETER: " + e.getMessage());
+ startButton.setEnabled(true);
+ return;
+ }
+
+ logger.log("=== Accelerometer Test ===\n");
+ isTestRunning = true;
+ handler.postDelayed(finishAccelerometer, MAX_TEST_LENGTH_MS);
+ }
+ };
+
+ public AccelerometerFragment() {
+ // Required empty public constructor
+ }
+
+ static List<Entry> getEntriesFromString(final String latencyString) {
+ List<Entry> entries = new ArrayList<>();
+ // "o" marks the start of the accelerometer data
+ int startIndex = latencyString.indexOf("o") + 1;
+
+ String[] brightnessStrings =
+ latencyString.substring(startIndex).trim().split("\n");
+ for (String str : brightnessStrings) {
+ String[] arr = str.split(" ");
+ final float timestampMs = Integer.parseInt(arr[0]) / 1000f;
+ final float value = Integer.parseInt(arr[1]);
+ entries.add(new Entry(timestampMs, value));
+ }
+ return entries;
+ }
+
+ static List<Entry> smoothEntries(List<Entry> entries, int windowSize) {
+ List<Entry> smoothEntries = new ArrayList<>();
+ for (int i = windowSize; i < entries.size() - windowSize; i++) {
+ final float time = entries.get(i).getX();
+ float avg = 0;
+ for (int j = i - windowSize; j <= i + windowSize; j++) {
+ avg += entries.get(j).getY() / (2 * windowSize + 1);
+ }
+ smoothEntries.add(new Entry(time, avg));
+ }
+ return smoothEntries;
+ }
+
+ static double[] findShifts(List<Entry> phoneEntries, List<Entry> waltEntries) {
+ double[] phoneTimes = new double[phoneEntries.size()];
+ double[] phoneValues = new double[phoneEntries.size()];
+ double[] waltTimes = new double[waltEntries.size()];
+ double[] waltValues = new double[waltEntries.size()];
+
+ for (int i = 0; i < phoneTimes.length; i++) {
+ phoneTimes[i] = phoneEntries.get(i).getX();
+ phoneValues[i] = phoneEntries.get(i).getY();
+ }
+
+ for (int i = 0; i < waltTimes.length; i++) {
+ waltTimes[i] = waltEntries.get(i).getX();
+ waltValues[i] = waltEntries.get(i).getY();
+ }
+
+ double[] shiftCorrelations = new double[401];
+ for (int i = 0; i < shiftCorrelations.length; i++) {
+ double shift = i / 10.;
+ final double[] shiftedPhoneTimes = new double[phoneTimes.length];
+ for (int j = 0; j < phoneTimes.length; j++) {
+ shiftedPhoneTimes[j] = phoneTimes[j] - shift;
+ }
+ final double[] interpolatedValues = interp(shiftedPhoneTimes, waltTimes, waltValues);
+ double sum = 0;
+ for (int j = 0; j < shiftedPhoneTimes.length; j++) {
+ // Calculate square dot product of phone and walt values
+ sum += Math.pow(phoneValues[j] * interpolatedValues[j], 2);
+ }
+ shiftCorrelations[i] = sum;
+ }
+ return shiftCorrelations;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ logger = SimpleLogger.getInstance(getContext());
+ waltDevice = WaltDevice.getInstance(getContext());
+
+ // Inflate the layout for this fragment
+ final View view = inflater.inflate(R.layout.fragment_accelerometer, container, false);
+ logTextView = (TextView) view.findViewById(R.id.txt_log);
+ startButton = view.findViewById(R.id.button_start);
+ latencyChart = (ScatterChart) view.findViewById(R.id.latency_chart);
+ latencyChartLayout = view.findViewById(R.id.latency_chart_layout);
+ logTextView.setMovementMethod(new ScrollingMovementMethod());
+ view.findViewById(R.id.button_close_chart).setOnClickListener(this);
+ sensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
+ accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+ if (accelerometer == null) {
+ logger.log("ERROR! Accelerometer sensor not found");
+ }
+ return view;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ logTextView.setText(logger.getLogText());
+ logger.registerReceiver(logReceiver);
+ startButton.setOnClickListener(this);
+ sensorManager.registerListener(
+ AccelerometerFragment.this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
+ }
+
+ @Override
+ public void onPause() {
+ logger.unregisterReceiver(logReceiver);
+ sensorManager.unregisterListener(AccelerometerFragment.this, accelerometer);
+ super.onPause();
+ }
+
+ public void appendLogText(String msg) {
+ logTextView.append(msg + "\n");
+ }
+
+ void startMeasurement() {
+ logger.log("Starting accelerometer latency measurement");
+ try {
+ accelerometerData = new StringBuilder();
+ phoneAccelerometerData.clear();
+ waltDevice.syncClock();
+ waltDevice.startListener();
+ realTimeOffsetMs =
+ SystemClock.elapsedRealtimeNanos() / 1e6 - waltDevice.clock.micros() / 1e3;
+ } catch (IOException e) {
+ logger.log("Error syncing clocks: " + e.getMessage());
+ startButton.setEnabled(true);
+ return;
+ }
+ Toast.makeText(getContext(), "Start shaking the phone and WALT!", Toast.LENGTH_LONG).show();
+ handler.postDelayed(startAccelerometer, 500);
+ }
+
+ /**
+ * Handler for all the button clicks on this screen.
+ */
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.button_start) {
+ latencyChartLayout.setVisibility(View.GONE);
+ startButton.setEnabled(false);
+ startMeasurement();
+ return;
+ }
+
+ if (v.getId() == R.id.button_close_chart) {
+ latencyChartLayout.setVisibility(View.GONE);
+ }
+ }
+
+ private void calculateAndDrawLatencyChart(final String latencyString) {
+ List<Entry> phoneEntries = new ArrayList<>();
+ List<Entry> waltEntries = getEntriesFromString(latencyString);
+ List<Entry> waltSmoothEntries = smoothEntries(waltEntries, 4);
+
+ for (AccelerometerEvent e : phoneAccelerometerData) {
+ phoneEntries.add(new Entry(e.callbackTimeMs, e.value));
+ }
+
+ while (phoneEntries.get(0).getX() < waltSmoothEntries.get(0).getX()) {
+ // This event is earlier than any walt event, so discard it
+ phoneEntries.remove(0);
+ }
+
+ while (phoneEntries.get(phoneEntries.size() - 1).getX() >
+ waltSmoothEntries.get(waltSmoothEntries.size() - 1).getX()) {
+ // This event is later than any walt event, so discard it
+ phoneEntries.remove(phoneEntries.size() - 1);
+ }
+
+ // Adjust waltEntries so min and max is the same as phoneEntries
+ float phoneMean = mean(phoneEntries);
+ float phoneMax = max(phoneEntries);
+ float phoneMin = min(phoneEntries);
+ float waltMin = min(waltSmoothEntries);
+ float phoneRange = phoneMax - phoneMin;
+ float waltRange = max(waltSmoothEntries) - waltMin;
+ for (Entry e : waltSmoothEntries) {
+ e.setY((e.getY() - waltMin) * (phoneRange / waltRange) + phoneMin - phoneMean);
+ }
+
+ // Adjust phoneEntries so mean=0
+ for (Entry e : phoneEntries) {
+ e.setY(e.getY() - phoneMean);
+ }
+
+ double[] shifts = findShifts(phoneEntries, waltSmoothEntries);
+ double bestShift = argmax(shifts) / 10d;
+ logger.log(String.format(Locale.US, "Accelerometer latency: %.1fms", bestShift));
+
+ double[] deltasKernelToCallback = new double[phoneAccelerometerData.size()];
+ for (int i = 0; i < deltasKernelToCallback.length; i++) {
+ deltasKernelToCallback[i] = phoneAccelerometerData.get(i).callbackTimeMs -
+ phoneAccelerometerData.get(i).kernelTimeMs;
+ }
+
+ logger.log(String.format(
+ Locale.US, "Mean kernel-to-callback latency: %.1fms", mean(deltasKernelToCallback)));
+
+ List<Entry> phoneEntriesShifted = new ArrayList<>();
+ for (Entry e : phoneEntries) {
+ phoneEntriesShifted.add(new Entry((float) (e.getX() - bestShift), e.getY()));
+ }
+
+ drawLatencyChart(phoneEntriesShifted, waltSmoothEntries);
+ }
+
+ private void drawLatencyChart(List<Entry> phoneEntriesShifted, List<Entry> waltEntries) {
+ final ScatterDataSet dataSetWalt =
+ new ScatterDataSet(waltEntries, "WALT Events");
+ dataSetWalt.setColor(Color.BLUE);
+ dataSetWalt.setScatterShape(ScatterChart.ScatterShape.CIRCLE);
+ dataSetWalt.setScatterShapeSize(8f);
+
+ final ScatterDataSet dataSetPhoneShifted =
+ new ScatterDataSet(phoneEntriesShifted, "Phone Events Shifted");
+ dataSetPhoneShifted.setColor(Color.RED);
+ dataSetPhoneShifted.setScatterShapeSize(10f);
+ dataSetPhoneShifted.setScatterShape(ScatterChart.ScatterShape.X);
+
+ final ScatterData scatterData = new ScatterData(dataSetWalt, dataSetPhoneShifted);
+ final Description desc = new Description();
+ desc.setText("");
+ desc.setTextSize(12f);
+ latencyChart.setDescription(desc);
+ latencyChart.setData(scatterData);
+ latencyChart.invalidate();
+ latencyChartLayout.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ if (isTestRunning) {
+ phoneAccelerometerData.add(new AccelerometerEvent(event));
+ }
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ }
+
+ private class AccelerometerEvent {
+ float callbackTimeMs;
+ float kernelTimeMs;
+ float value;
+
+ AccelerometerEvent(SensorEvent event) {
+ callbackTimeMs = waltDevice.clock.micros() / 1e3f;
+ kernelTimeMs = (float) (event.timestamp / 1e6f - realTimeOffsetMs);
+ value = event.values[2];
+ }
+ }
+}
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/AudioFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/AudioFragment.java
index 65452ff..3db3723 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/AudioFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/AudioFragment.java
@@ -16,6 +16,8 @@
package org.chromium.latency.walt;
+import static org.chromium.latency.walt.Utils.getIntPreference;
+
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -24,8 +26,6 @@ import android.content.pm.PackageManager;
import android.graphics.Color;
import android.media.AudioManager;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.content.ContextCompat;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
@@ -34,6 +34,9 @@ import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.Fragment;
+
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.LimitLine;
@@ -45,8 +48,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
-import static org.chromium.latency.walt.Utils.getIntPreference;
-
/**
* A simple {@link Fragment} subclass.
*/
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/AutoRunFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/AutoRunFragment.java
index f2f2a7f..71f5979 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/AutoRunFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/AutoRunFragment.java
@@ -21,14 +21,15 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
-import android.support.annotation.NonNull;
-import android.support.v4.app.Fragment;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/BaseUsbConnection.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/BaseUsbConnection.java
index f0e6c62..4726d12 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/BaseUsbConnection.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/BaseUsbConnection.java
@@ -24,7 +24,8 @@ import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
-import android.support.v4.content.LocalBroadcastManager;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.util.HashMap;
import java.util.Locale;
@@ -44,7 +45,7 @@ public abstract class BaseUsbConnection {
protected UsbDeviceConnection usbConnection;
public BaseUsbConnection(Context context) {
- this.context = context;
+ this.context = context.getApplicationContext();
usbManager = (UsbManager) this.context.getSystemService(Context.USB_SERVICE);
logger = SimpleLogger.getInstance(context);
broadcastManager = LocalBroadcastManager.getInstance(context);
@@ -184,7 +185,8 @@ public abstract class BaseUsbConnection {
public UsbDevice findUsbDevice() {
- logger.log(String.format("Looking for TeensyUSB VID=0x%x PID=0x%x", getVid(), getPid()));
+ logger.log(String.format(Locale.US,
+ "Looking for TeensyUSB VID=0x%x PID=0x%x", getVid(), getPid()));
HashMap<String, UsbDevice> deviceHash = usbManager.getDeviceList();
if (deviceHash.size() == 0) {
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/CrashLogActivity.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/CrashLogActivity.java
index 00e80ed..f2ce3d1 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/CrashLogActivity.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/CrashLogActivity.java
@@ -17,10 +17,11 @@
package org.chromium.latency.walt;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;
+import androidx.appcompat.app.AppCompatActivity;
+
/**
* A separate activity to display exception trace on the screen in case of a crash.
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/DiagnosticsFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/DiagnosticsFragment.java
index 65ec3bf..17b0f2f 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/DiagnosticsFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/DiagnosticsFragment.java
@@ -21,13 +21,14 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
+import androidx.fragment.app.Fragment;
+
/**
* This screen allows to perform different tasks useful for diagnostics.
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/DragLatencyFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/DragLatencyFragment.java
index af03e36..9453c04 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/DragLatencyFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/DragLatencyFragment.java
@@ -16,12 +16,12 @@
package org.chromium.latency.walt;
+import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -29,6 +29,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
+import androidx.fragment.app.Fragment;
+
import com.github.mikephil.charting.charts.ScatterChart;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.data.Entry;
@@ -67,6 +69,7 @@ public class DragLatencyFragment extends Fragment
}
};
+ @SuppressLint("ClickableViewAccessibility")
private View.OnTouchListener touchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
@@ -143,6 +146,7 @@ public class DragLatencyFragment extends Fragment
/**
* @return true if measurement was successfully started
*/
+ @SuppressLint("ClickableViewAccessibility")
boolean startMeasurement() {
logger.log("Starting drag latency test");
try {
@@ -185,6 +189,7 @@ public class DragLatencyFragment extends Fragment
updateCountsDisplay();
}
+ @SuppressLint("ClickableViewAccessibility")
void finishAndShowStats() {
touchCatcher.stopAnimation();
waltDevice.stopListener();
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/FastPathSurfaceView.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/FastPathSurfaceView.java
index 449627f..0c5ad59 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/FastPathSurfaceView.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/FastPathSurfaceView.java
@@ -22,13 +22,14 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
-import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
+import androidx.annotation.RequiresApi;
+
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/FrontPageFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/FrontPageFragment.java
index cb125e3..84fbbbe 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/FrontPageFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/FrontPageFragment.java
@@ -18,13 +18,14 @@ package org.chromium.latency.walt;
import android.graphics.Color;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.fragment.app.Fragment;
+
/**
* A simple {@link Fragment} subclass.
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/LogFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/LogFragment.java
index 069d032..1e26b32 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/LogFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/LogFragment.java
@@ -17,25 +17,26 @@
package org.chromium.latency.walt;
-import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+
/**
* A screen that shows the log.
*/
public class LogFragment extends Fragment {
- private Activity activity;
+ private AppCompatActivity activity;
private SimpleLogger logger;
TextView textView;
@@ -56,7 +57,7 @@ public class LogFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- activity = getActivity();
+ activity = (AppCompatActivity) getActivity();
logger = SimpleLogger.getInstance(getContext());
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_log, container, false);
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/LogUploader.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/LogUploader.java
index a73f456..aa10f74 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/LogUploader.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/LogUploader.java
@@ -17,7 +17,8 @@
package org.chromium.latency.walt;
import android.content.Context;
-import android.support.v4.content.AsyncTaskLoader;
+
+import androidx.loader.content.AsyncTaskLoader;
import java.io.BufferedOutputStream;
import java.io.IOException;
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/MainActivity.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/MainActivity.java
index ac1df47..81a637b 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/MainActivity.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/MainActivity.java
@@ -16,6 +16,8 @@
package org.chromium.latency.walt;
+import static org.chromium.latency.walt.Utils.getBooleanPreference;
+
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
@@ -30,18 +32,6 @@ import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.StrictMode;
-import android.preference.PreferenceManager;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.content.Loader;
-import android.support.v4.content.LocalBroadcastManager;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@@ -49,7 +39,18 @@ import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
-import org.chromium.latency.walt.programmer.Programmer;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+import androidx.loader.content.Loader;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.PreferenceManager;
import java.io.File;
import java.io.FileOutputStream;
@@ -59,7 +60,7 @@ import java.io.StringWriter;
import java.util.Date;
import java.util.Locale;
-import static org.chromium.latency.walt.Utils.getBooleanPreference;
+import org.chromium.latency.walt.programmer.Programmer;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "WALT";
@@ -218,7 +219,7 @@ public class MainActivity extends AppCompatActivity {
broadcastManager = LocalBroadcastManager.getInstance(this);
// Add basic version and device info to the log
- logger.log(String.format("WALT v%s (versionCode=%d)",
+ logger.log(String.format(Locale.US, "WALT v%s (versionCode=%d)",
BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE));
logger.log("WALT protocol version " + WaltDevice.PROTOCOL_VERSION);
logger.log("DEVICE INFO:");
@@ -325,6 +326,11 @@ public class MainActivity extends AppCompatActivity {
switchScreen(newFragment, "Drag Latency");
}
+ public void onClickAccelerometer(View view) {
+ AccelerometerFragment newFragment = new AccelerometerFragment();
+ switchScreen(newFragment, "Accelerometer Latency");
+ }
+
public void onClickOpenLog(View view) {
LogFragment logFragment = new LogFragment();
// menu.findItem(R.id.action_help).setVisible(false);
@@ -349,13 +355,8 @@ public class MainActivity extends AppCompatActivity {
}
public void onClickPing(View view) {
- long t1 = waltDevice.clock.micros();
try {
- waltDevice.command(WaltDevice.CMD_PING);
- long dt = waltDevice.clock.micros() - t1;
- logger.log(String.format(Locale.US,
- "Ping reply in %.1fms", dt / 1000.
- ));
+ waltDevice.ping();
} catch (IOException e) {
logger.log("Error sending ping: " + e.getMessage());
}
@@ -487,7 +488,7 @@ public class MainActivity extends AppCompatActivity {
// A reasonable world readable location,on many phones it's /storage/emulated/Documents
// TODO: make this location configurable?
- File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
+ File path = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
File file = null;
FileOutputStream outStream = null;
@@ -511,7 +512,7 @@ public class MainActivity extends AppCompatActivity {
}
public void clearLogFile() {
- File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
+ File path = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
try {
File file = new File(path, LOG_FILENAME);
file.delete();
@@ -541,7 +542,8 @@ public class MainActivity extends AppCompatActivity {
}
private static boolean startsWithHttp(String url) {
- return url.toLowerCase().startsWith("http://") || url.toLowerCase().startsWith("https://");
+ return url.toLowerCase(Locale.getDefault()).startsWith("http://") ||
+ url.toLowerCase(Locale.getDefault()).startsWith("https://");
}
private void showUploadLogDialog() {
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/MidiFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/MidiFragment.java
index c6f1118..8d3fe6a 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/MidiFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/MidiFragment.java
@@ -20,13 +20,14 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
+import androidx.fragment.app.Fragment;
+
import java.util.Locale;
public class MidiFragment extends Fragment
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/NumberPickerPreference.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/NumberPickerPreference.java
index 9d71d42..cf4ef55 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/NumberPickerPreference.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/NumberPickerPreference.java
@@ -19,13 +19,15 @@ package org.chromium.latency.walt;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v7.preference.DialogPreference;
-import android.support.v7.preference.PreferenceDialogFragmentCompat;
import android.util.AttributeSet;
import android.view.View;
+import androidx.annotation.NonNull;
+import androidx.preference.DialogPreference;
+import androidx.preference.PreferenceDialogFragmentCompat;
+
public class NumberPickerPreference extends DialogPreference {
+ private boolean isInitSet = false;
private int currentValue;
private int maxValue;
private int minValue;
@@ -62,9 +64,13 @@ public class NumberPickerPreference extends DialogPreference {
}
public void setValue(int value) {
- currentValue = value;
- persistInt(currentValue);
- setSummary(String.format(defaultSummary, getValue()));
+ boolean changed = (currentValue != value);
+ if (changed || !isInitSet) {
+ isInitSet = true;
+ currentValue = value;
+ persistInt(currentValue);
+ setSummary(String.format(defaultSummary, getValue()));
+ }
}
@Override
@@ -73,8 +79,8 @@ public class NumberPickerPreference extends DialogPreference {
}
@Override
- protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
- setValue(restorePersistedValue ? getPersistedInt(currentValue) : (Integer) defaultValue);
+ protected void onSetInitialValue(Object defaultValue) {
+ setValue((Integer) defaultValue);
}
public static class NumberPickerPreferenceDialogFragmentCompat
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/ScreenResponseFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/ScreenResponseFragment.java
index 629ed7d..d1ebfac 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/ScreenResponseFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/ScreenResponseFragment.java
@@ -16,16 +16,15 @@
package org.chromium.latency.walt;
+import static org.chromium.latency.walt.Utils.getBooleanPreference;
+import static org.chromium.latency.walt.Utils.getIntPreference;
+
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
-import android.support.v4.app.Fragment;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.app.AppCompatActivity;
import android.text.method.ScrollingMovementMethod;
import android.view.Choreographer;
import android.view.LayoutInflater;
@@ -36,6 +35,11 @@ import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.data.Entry;
@@ -47,9 +51,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
-import static org.chromium.latency.walt.Utils.getBooleanPreference;
-import static org.chromium.latency.walt.Utils.getIntPreference;
-
/**
* Measurement of screen response time when switching between black and white.
*/
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/SettingsFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/SettingsFragment.java
index 4f74fc4..ace30cc 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/SettingsFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/SettingsFragment.java
@@ -18,19 +18,21 @@ package org.chromium.latency.walt;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.DialogFragment;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.content.ContextCompat;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceFragmentCompat;
-import android.support.v7.preference.PreferenceScreen;
-import android.support.v7.widget.Toolbar;
import android.view.View;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentTransaction;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
-public class SettingsFragment extends PreferenceFragmentCompat implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
+
+public class SettingsFragment extends PreferenceFragmentCompat implements
+ PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
private Toolbar toolbar;
@@ -70,8 +72,8 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Prefer
DialogFragment fragment = NumberPickerPreference.
NumberPickerPreferenceDialogFragmentCompat.newInstance(preference.getKey());
fragment.setTargetFragment(this, 0);
- fragment.show(getFragmentManager(),
- "android.support.v7.preference.PreferenceFragment.DIALOG");
+ fragment.show(getParentFragmentManager(),
+ "androidx.preference.PreferenceFragment.DIALOG");
} else {
super.onDisplayPreferenceDialog(preference);
}
@@ -90,7 +92,8 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Prefer
args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey());
fragment.setArguments(args);
- FragmentTransaction ft = preferenceFragmentCompat.getFragmentManager().beginTransaction();
+ FragmentTransaction ft = preferenceFragmentCompat.
+ getParentFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, fragment, preferenceScreen.getKey());
ft.addToBackStack(preferenceScreen.getTitle().toString());
ft.commit();
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/SimpleLogger.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/SimpleLogger.java
index 6059e0f..9244377 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/SimpleLogger.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/SimpleLogger.java
@@ -20,7 +20,9 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.support.v4.content.LocalBroadcastManager;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
import android.util.Log;
/**
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/TapLatencyFragment.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/TapLatencyFragment.java
index e26a328..ca0e80b 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/TapLatencyFragment.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/TapLatencyFragment.java
@@ -16,11 +16,11 @@
package org.chromium.latency.walt;
+import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.text.method.ScrollingMovementMethod;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -29,6 +29,8 @@ import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
+import androidx.fragment.app.Fragment;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;
@@ -71,6 +73,7 @@ public class TapLatencyFragment extends Fragment
}
};
+ @SuppressLint("ClickableViewAccessibility")
private View.OnTouchListener touchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
@@ -212,6 +215,7 @@ public class TapLatencyFragment extends Fragment
moveCountsView.setText(String.format(Locale.US, "⇄ %d", moveCount));
}
+ @SuppressLint("ClickableViewAccessibility")
void restartMeasurement() {
logger.log("\n## Restarting tap latency measurement. Re-sync clocks ...");
try {
@@ -241,6 +245,7 @@ public class TapLatencyFragment extends Fragment
tapCatcherView.setOnTouchListener(touchListener);
}
+ @SuppressLint("ClickableViewAccessibility")
void finishAndShowStats() {
tapCatcherView.setOnTouchListener(null);
waltDevice.checkDrift();
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/TraceLogger.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/TraceLogger.java
index 6fdb8d9..964e9c6 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/TraceLogger.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/TraceLogger.java
@@ -25,6 +25,7 @@ import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.util.ArrayList;
+import java.util.Locale;
/**
* Used to log events for Android systrace
@@ -58,12 +59,13 @@ class TraceLogger {
StringBuilder sb = new StringBuilder();
int pid = android.os.Process.myPid();
for (TraceEvent e : traceEvents) {
- sb.append(String.format(
- "WALTThread-1234 (%d) [000] ...1 %s: tracing_mark_write: B|%d|%s|description=%s|WALT\n",
- pid, df.format(e.startTimeMicros / 1e6), pid, e.title, e.description));
- sb.append(String.format(
- "WALTThread-1234 (%d) [000] ...1 %s: tracing_mark_write: E|%d|%s||WALT\n",
- pid, df.format(e.finishTimeMicros / 1e6), pid, e.title));
+ sb.append(String.format(Locale.US,
+ "WALTThread-1234 (%d) [000] ...1 %s: tracing_mark_write: "
+ + "B|%d|%s|description=%s|WALT\n",
+ pid, df.format(e.startTimeMicros / 1e6), pid, e.title, e.description));
+ sb.append(String.format(Locale.US,
+ "WALTThread-1234 (%d) [000] ...1 %s: tracing_mark_write: E|%d|%s||WALT\n",
+ pid, df.format(e.finishTimeMicros / 1e6), pid, e.title));
}
return sb.toString();
}
@@ -85,7 +87,7 @@ class TraceLogger {
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file, true));
writer.write(getLogText());
writer.close();
- logger.log(String.format("TraceLogger wrote %d events to %s",
+ logger.log(String.format(Locale.US, "TraceLogger wrote %d events to %s",
traceEvents.size(), file.getAbsolutePath()));
} catch (IOException e) {
logger.log("ERROR: IOException writing to trace.txt");
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/UsMotionEvent.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/UsMotionEvent.java
index e961949..f68e461 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/UsMotionEvent.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/UsMotionEvent.java
@@ -20,6 +20,7 @@ import android.util.Log;
import android.view.MotionEvent;
import java.lang.reflect.Method;
+import java.util.Locale;
/**
* A convenient representation of MotionEvent events
@@ -71,13 +72,13 @@ public class UsMotionEvent {
public String toString() {
- return String.format("%d %f %f",
+ return String.format(Locale.US, "%d %f %f",
kernelTime, x, y);
}
public String toStringLong() {
- return String.format("Event: t=%d x=%.1f y=%.1f slot=%d num=%d %s",
+ return String.format(Locale.US, "Event: t=%d x=%.1f y=%.1f slot=%d num=%d %s",
kernelTime, x, y, slot, num, actionToString(action));
}
@@ -119,7 +120,7 @@ public class UsMotionEvent {
private long getEventTimeMicro(MotionEvent event) {
long t_nanos = -1;
try {
- Class cls = Class.forName("android.view.MotionEvent");
+ Class<?> cls = Class.forName("android.view.MotionEvent");
Method myTimeGetter = cls.getMethod("getEventTimeNano");
t_nanos = (long) myTimeGetter.invoke(event);
} catch (Exception e) {
@@ -132,7 +133,7 @@ public class UsMotionEvent {
private long getHistoricalEventTimeMicro(MotionEvent event, int pos) {
long t_nanos = -1;
try {
- Class cls = Class.forName("android.view.MotionEvent");
+ Class<?> cls = Class.forName("android.view.MotionEvent");
Method myTimeGetter = cls.getMethod("getHistoricalEventTimeNano", new Class[] {int.class});
t_nanos = (long) myTimeGetter.invoke(event, new Object[]{pos});
} catch (Exception e) {
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/Utils.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/Utils.java
index 19c7488..46796e2 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/Utils.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/Utils.java
@@ -18,11 +18,15 @@ package org.chromium.latency.walt;
import android.content.Context;
import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-import android.support.annotation.StringRes;
+
+import androidx.preference.PreferenceManager;
+import androidx.annotation.StringRes;
+
+import com.github.mikephil.charting.data.Entry;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.List;
/**
* Kitchen sink for small utility functions
@@ -120,6 +124,11 @@ public class Utils {
return sb.toString();
}
+ public static int argmax(double[] a) {
+ int imax = 0;
+ for (int i=1; i<a.length; i++) if (a[i] > a[imax]) imax = i;
+ return imax;
+ }
public static int argmin(double[] a) {
int imin = 0;
@@ -177,6 +186,30 @@ public class Utils {
return preferences.getString(context.getString(keyId), defaultValue);
}
+ static float min(List<Entry> entries) {
+ float min = Float.MAX_VALUE;
+ for (Entry e : entries) {
+ min = Math.min(min, e.getY());
+ }
+ return min;
+ }
+
+ static float max(List<Entry> entries) {
+ float max = Float.MIN_VALUE;
+ for (Entry e : entries) {
+ max = Math.max(max, e.getY());
+ }
+ return max;
+ }
+
+ static float mean(List<Entry> entries) {
+ float mean = 0;
+ for (Entry e : entries) {
+ mean += e.getY()/entries.size();
+ }
+ return mean;
+ }
+
public enum ListenerState {
RUNNING,
STARTING,
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/WaltDevice.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/WaltDevice.java
index 8ec2cb4..631afb8 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/WaltDevice.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/WaltDevice.java
@@ -23,6 +23,7 @@ import android.os.Handler;
import android.util.Log;
import java.io.IOException;
+import java.util.Locale;
/**
* A singleton used as an interface for the physical WALT device.
@@ -31,7 +32,7 @@ public class WaltDevice implements WaltConnection.ConnectionStateListener {
private static final int DEFAULT_DRIFT_LIMIT_US = 1500;
private static final String TAG = "WaltDevice";
- public static final String PROTOCOL_VERSION = "5";
+ public static final String PROTOCOL_VERSION = "6";
// Teensy side commands. Each command is a single char
// Based on #defines section in walt.ino
@@ -56,6 +57,7 @@ public class WaltDevice implements WaltConnection.ConnectionStateListener {
static final char CMD_BEEP_STOP = 'S'; // Stop generating tone
static final char CMD_MIDI = 'M'; // Start listening for a MIDI message
static final char CMD_NOTE = 'N'; // Generate a MIDI NoteOn message
+ static final char CMD_ACCELEROMETER = 'O'; // Generate a MIDI NoteOn message
private static final int BYTE_BUFFER_SIZE = 1024 * 4;
private byte[] buffer = new byte[BYTE_BUFFER_SIZE];
@@ -221,6 +223,19 @@ public class WaltDevice implements WaltConnection.ConnectionStateListener {
}
}
+ public void ping() throws IOException {
+ if (!isConnected() || clock == null) {
+ throw new IOException("Not connected to WALT");
+ }
+
+ long t1 = clock.micros();
+ command(CMD_PING);
+ long dt = clock.micros() - t1;
+ logger.log(String.format(Locale.US,
+ "Ping reply in %.1fms", dt / 1000.
+ ));
+ }
+
public void syncClock() throws IOException {
clock = connection.syncClock();
}
@@ -247,7 +262,7 @@ public class WaltDevice implements WaltConnection.ConnectionStateListener {
return;
}
int drift = Math.abs(clock.getMeanLag());
- String msg = String.format("Remote clock delayed between %d and %d us",
+ String msg = String.format(Locale.US, "Remote clock delayed between %d and %d us",
clock.minLag, clock.maxLag);
// TODO: Convert the limit to user editable preference
if (drift > DEFAULT_DRIFT_LIMIT_US) {
diff --git a/android/WALT/app/src/main/java/org/chromium/latency/walt/programmer/FirmwareImage.java b/android/WALT/app/src/main/java/org/chromium/latency/walt/programmer/FirmwareImage.java
index d2feb01..0f8b1ef 100644
--- a/android/WALT/app/src/main/java/org/chromium/latency/walt/programmer/FirmwareImage.java
+++ b/android/WALT/app/src/main/java/org/chromium/latency/walt/programmer/FirmwareImage.java
@@ -24,6 +24,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.util.Arrays;
+import java.util.Locale;
class FirmwareImage {
private static final String TAG = "FirmwareImage";
@@ -89,7 +90,8 @@ class FirmwareImage {
return;
}
default: {
- throw new ParseException(String.format("Unknown code '%x'", code), cur);
+ throw new ParseException(String.format(
+ Locale.US, "Unknown code '%x'", code), cur);
}
}
}
@@ -119,8 +121,8 @@ class FirmwareImage {
dest[addr + i] = parseByte(line, pos + i * 2);
mask[addr + i] = true;
} catch (ArrayIndexOutOfBoundsException e) {
- throw new ParseException(String.format("Address '%x' out of range", addr + i),
- pos + i * 2);
+ throw new ParseException(String.format(Locale.US,
+ "Address '%x' out of range", addr + i), pos + i * 2);
}
}
}
diff --git a/android/WALT/app/src/main/jni/Android.bp b/android/WALT/app/src/main/jni/Android.bp
deleted file mode 100644
index cbbaa82..0000000
--- a/android/WALT/app/src/main/jni/Android.bp
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (C) 2015 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-cc_library_shared {
- name: "sync_clock_jni",
- srcs: [
- "sync_clock_jni.c",
- "sync_clock.c",
- "player.c",
- ],
-
- cflags: [
- "-g",
- "-DUSE_LIBLOG",
- "-Werror",
- "-Wno-deprecated-declarations",
- ],
-
- shared_libs: [
- // needed for logcat
- "libcutils",
-
- "libOpenSLES",
- "liblog",
- ],
-}
diff --git a/android/WALT/app/src/main/jni/Android.mk b/android/WALT/app/src/main/jni/Android.mk
new file mode 100644
index 0000000..edf1ddf
--- /dev/null
+++ b/android/WALT/app/src/main/jni/Android.mk
@@ -0,0 +1,27 @@
+# Copyright (C) 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := sync_clock_jni
+LOCAL_SRC_FILES := sync_clock_jni.c sync_clock.c player.c
+
+LOCAL_CFLAGS := -g -DUSE_LIBLOG -Werror -Wno-deprecated-declarations
+
+LOCAL_LDLIBS := -lOpenSLES -llog
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/android/WALT/app/src/main/jni/Application.mk b/android/WALT/app/src/main/jni/Application.mk
index 7c01d06..a6cb06d 100644
--- a/android/WALT/app/src/main/jni/Application.mk
+++ b/android/WALT/app/src/main/jni/Application.mk
@@ -14,4 +14,4 @@
#
APP_ABI := all
-APP_PLATFORM := android-9
+APP_PLATFORM := android-21
diff --git a/android/WALT/app/src/main/res/drawable/ic_brightness_7_black_24dp.xml b/android/WALT/app/src/main/res/drawable/ic_brightness_7_black_24dp.xml
deleted file mode 100644
index e504de1..0000000
--- a/android/WALT/app/src/main/res/drawable/ic_brightness_7_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zm0,-10c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z"/>
-</vector>
diff --git a/android/WALT/app/src/main/res/drawable/ic_chevron_left_black_24dp.xml b/android/WALT/app/src/main/res/drawable/ic_chevron_left_black_24dp.xml
deleted file mode 100644
index e6bb3ca..0000000
--- a/android/WALT/app/src/main/res/drawable/ic_chevron_left_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/>
-</vector>
diff --git a/android/WALT/app/src/main/res/drawable/ic_equalizer_black_24dp.xml b/android/WALT/app/src/main/res/drawable/ic_equalizer_black_24dp.xml
deleted file mode 100644
index 6322102..0000000
--- a/android/WALT/app/src/main/res/drawable/ic_equalizer_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M10,20h4V4h-4v16zm-6,0h4v-8H4v8zM16,9v11h4V9h-4z"/>
-</vector>
diff --git a/android/WALT/app/src/main/res/drawable/ic_help_black_24dp.xml b/android/WALT/app/src/main/res/drawable/ic_help_black_24dp.xml
deleted file mode 100644
index a3936eb..0000000
--- a/android/WALT/app/src/main/res/drawable/ic_help_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zm1,17h-2v-2h2v2zm2.07,-7.75l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2H8c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z"/>
-</vector>
diff --git a/android/WALT/app/src/main/res/drawable/ic_import_export_black_24dp.xml b/android/WALT/app/src/main/res/drawable/ic_import_export_black_24dp.xml
deleted file mode 100644
index cac4f1f..0000000
--- a/android/WALT/app/src/main/res/drawable/ic_import_export_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M9,3L5,6.99h3V14h2V6.99h3L9,3zm7,14.01V10h-2v7.01h-3L15,21l4,-3.99h-3z"/>
-</vector>
diff --git a/android/WALT/app/src/main/res/drawable/ic_mic_black_24dp.xml b/android/WALT/app/src/main/res/drawable/ic_mic_black_24dp.xml
deleted file mode 100644
index 15356bb..0000000
--- a/android/WALT/app/src/main/res/drawable/ic_mic_black_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M12,14c1.66,0 2.99,-1.34 2.99,-3L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6c0,1.66 1.34,3 3,3zm5.3,-3c0,3 -2.54,5.1 -5.3,5.1S6.7,14 6.7,11H5c0,3.41 2.72,6.23 6,6.72V21h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z"/>
-</vector>
diff --git a/android/WALT/app/src/main/res/drawable/ic_music_note_black_24dp.xml b/android/WALT/app/src/main/res/drawable/ic_music_note_black_24dp.xml
index 2e5b3cc..fb95660 100644
--- a/android/WALT/app/src/main/res/drawable/ic_music_note_black_24dp.xml
+++ b/android/WALT/app/src/main/res/drawable/ic_music_note_black_24dp.xml
@@ -5,5 +5,5 @@ android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
- android:pathData="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/>
+ android:pathData="M12 3v10.55c-0.59-0.34-1.27-0.55-2-0.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z"/>
</vector> \ No newline at end of file
diff --git a/android/WALT/app/src/main/res/drawable/ic_settings_black_24dp.xml b/android/WALT/app/src/main/res/drawable/ic_settings_black_24dp.xml
index ace746c..896ea9d 100644
--- a/android/WALT/app/src/main/res/drawable/ic_settings_black_24dp.xml
+++ b/android/WALT/app/src/main/res/drawable/ic_settings_black_24dp.xml
@@ -5,5 +5,5 @@
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
- android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/>
+ android:pathData="M19.1,12.9a2.8,2.8 0,0 0,0.1 -0.9,2.8 2.8,0 0,0 -0.1,-0.9l2.1,-1.6a0.7,0.7 0,0 0,0.1 -0.6L19.4,5.5a0.7,0.7 0,0 0,-0.6 -0.2l-2.4,1a6.5,6.5 0,0 0,-1.6 -0.9l-0.4,-2.6a0.5,0.5 0,0 0,-0.5 -0.4H10.1a0.5,0.5 0,0 0,-0.5 0.4L9.3,5.4a5.6,5.6 0,0 0,-1.7 0.9l-2.4,-1a0.4,0.4 0,0 0,-0.5 0.2l-2,3.4c-0.1,0.2 0,0.4 0.2,0.6l2,1.6a2.8,2.8 0,0 0,-0.1 0.9,2.8 2.8,0 0,0 0.1,0.9L2.8,14.5a0.7,0.7 0,0 0,-0.1 0.6l1.9,3.4a0.7,0.7 0,0 0,0.6 0.2l2.4,-1a6.5,6.5 0,0 0,1.6 0.9l0.4,2.6a0.5,0.5 0,0 0,0.5 0.4h3.8a0.5,0.5 0,0 0,0.5 -0.4l0.3,-2.6a5.6,5.6 0,0 0,1.7 -0.9l2.4,1a0.4,0.4 0,0 0,0.5 -0.2l2,-3.4c0.1,-0.2 0,-0.4 -0.2,-0.6ZM12,15.6A3.6,3.6 0,1 1,15.6 12,3.6 3.6,0 0,1 12,15.6Z"/>
</vector>
diff --git a/android/WALT/app/src/main/res/drawable/ic_system_update_alt_black_24dp.xml b/android/WALT/app/src/main/res/drawable/ic_system_update_alt_black_24dp.xml
index ec96a71..6ce20c7 100644
--- a/android/WALT/app/src/main/res/drawable/ic_system_update_alt_black_24dp.xml
+++ b/android/WALT/app/src/main/res/drawable/ic_system_update_alt_black_24dp.xml
@@ -5,5 +5,5 @@
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
- android:pathData="M12 16.5l4-4h-3v-9h-2v9H8l4 4zm9-13h-6v1.99h6v14.03H3V5.49h6V3.5H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2v-14c0-1.1-.9-2-2-2z"/>
+ android:pathData="M12 16.5l4-4h-3v-9h-2v9H8l4 4zm9-13h-6v1.99h6v14.03H3V5.49h6V3.5H3c-1.1 0-2 0.9-2 2v14c0 1.1 0.9 2 2 2h18c1.1 0 2-0.9 2-2v-14c0-1.1-0.9-2-2-2z"/>
</vector>
diff --git a/android/WALT/app/src/main/res/layout/activity_main.xml b/android/WALT/app/src/main/res/layout/activity_main.xml
index 57e7679..ad9a864 100644
--- a/android/WALT/app/src/main/res/layout/activity_main.xml
+++ b/android/WALT/app/src/main/res/layout/activity_main.xml
@@ -1,27 +1,20 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:orientation="vertical"
tools:context=".MainActivity">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
-
- <include
- android:id="@+id/toolbar_main"
- layout="@layout/toolbar" />
-
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/fragment_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
+ <include
+ android:id="@+id/toolbar_main"
+ layout="@layout/toolbar" />
+ <FrameLayout
+ android:id="@+id/fragment_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
- </FrameLayout>
- </LinearLayout>
+ </FrameLayout>
-</RelativeLayout>
+</LinearLayout> \ No newline at end of file
diff --git a/android/WALT/app/src/main/res/layout/dialog_upload.xml b/android/WALT/app/src/main/res/layout/dialog_upload.xml
index be990a2..88983d7 100644
--- a/android/WALT/app/src/main/res/layout/dialog_upload.xml
+++ b/android/WALT/app/src/main/res/layout/dialog_upload.xml
@@ -9,7 +9,8 @@
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:hint="Enter URL"
+ android:hint="@string/hint_url"
+ android:autofillHints="Enter URL"
android:inputType="textUri" />
<ProgressBar
diff --git a/android/WALT/app/src/main/res/layout/fragment_accelerometer.xml b/android/WALT/app/src/main/res/layout/fragment_accelerometer.xml
new file mode 100644
index 0000000..693287f
--- /dev/null
+++ b/android/WALT/app/src/main/res/layout/fragment_accelerometer.xml
@@ -0,0 +1,80 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="org.chromium.latency.walt.TapLatencyFragment">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <View android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="1" />
+
+ <ImageButton
+ android:id="@+id/button_start"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:tint="@color/button_tint"
+ app:srcCompat="@drawable/ic_play_arrow_black_24dp"
+ android:contentDescription="@string/start" />
+
+ </LinearLayout>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <RelativeLayout
+ android:id="@+id/latency_chart_layout"
+ android:layout_width="match_parent"
+ android:visibility="gone"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:layout_margin="5dp"
+ android:background="@drawable/border">
+
+ <com.github.mikephil.charting.charts.ScatterChart
+ android:id="@+id/latency_chart"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_margin="5dp" />
+
+ <Button
+ android:id="@+id/button_close_chart"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@id/latency_chart"
+ android:layout_alignEnd="@id/latency_chart"
+ android:tint="@color/button_tint"
+ android:layout_margin="5dp"
+ android:text="@string/close" />
+ </RelativeLayout>
+
+ <TextView
+ android:id="@+id/txt_log"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:background="#000000"
+ android:gravity="bottom"
+ android:textColor="#ffffff"
+ android:scrollbars="vertical" />
+
+ </LinearLayout>
+ </FrameLayout>
+ </LinearLayout>
+</FrameLayout>
diff --git a/android/WALT/app/src/main/res/layout/fragment_audio.xml b/android/WALT/app/src/main/res/layout/fragment_audio.xml
index e11f157..190f658 100644
--- a/android/WALT/app/src/main/res/layout/fragment_audio.xml
+++ b/android/WALT/app/src/main/res/layout/fragment_audio.xml
@@ -19,24 +19,26 @@
android:id="@+id/button_stop_audio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:tint="@color/button_tint"
- android:src="@drawable/ic_stop_black_24dp" />
+ walt:srcCompat="@drawable/ic_stop_black_24dp"
+ android:contentDescription="@string/stop" />
<ImageButton
android:id="@+id/button_start_audio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:tint="@color/button_tint"
- android:src="@drawable/ic_play_arrow_black_24dp" />
+ walt:srcCompat="@drawable/ic_play_arrow_black_24dp"
+ android:contentDescription="@string/start" />
<Spinner
android:id="@+id/spinner_audio_mode"
android:layout_height="45dp"
android:layout_width="fill_parent"
- android:layout_toRightOf="@id/button_stop_audio"
- android:layout_toLeftOf="@id/button_start_audio"
+ android:layout_toEndOf="@id/button_stop_audio"
+ android:layout_toStartOf="@id/button_start_audio"
android:prompt="@string/audio_mode"/>
</RelativeLayout>
diff --git a/android/WALT/app/src/main/res/layout/fragment_diagnostics.xml b/android/WALT/app/src/main/res/layout/fragment_diagnostics.xml
index 82a3cae..2950bac 100644
--- a/android/WALT/app/src/main/res/layout/fragment_diagnostics.xml
+++ b/android/WALT/app/src/main/res/layout/fragment_diagnostics.xml
@@ -1,4 +1,5 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -23,7 +24,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_usb_black_24dp" />
+ app:srcCompat="@drawable/ic_usb_black_24dp"
+ android:contentDescription="@string/reconnect" />
<LinearLayout
android:layout_width="match_parent"
@@ -33,12 +35,12 @@
<TextView
style="@style/MenuTextTop"
- android:text="Reconnect" />
+ android:text="@string/reconnect" />
<TextView
android:visibility="gone"
style="@style/MenuTextBottom"
- android:text="TBD: Conn status" />
+ android:text="@string/tbd_conn_status" />
</LinearLayout>
@@ -54,7 +56,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_swap_horiz_black_24dp" />
+ app:srcCompat="@drawable/ic_swap_horiz_black_24dp"
+ android:contentDescription="@string/ping" />
<LinearLayout
android:layout_width="match_parent"
@@ -64,11 +67,11 @@
<TextView
style="@style/MenuTextTop"
- android:text="Ping" />
+ android:text="@string/ping" />
<TextView
style="@style/MenuTextBottom"
- android:text="Ping over USB with 1 byte" />
+ android:text="@string/ping_over_usb_with_1_byte" />
</LinearLayout>
@@ -84,7 +87,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_schedule_black_24dp" />
+ app:srcCompat="@drawable/ic_schedule_black_24dp"
+ android:contentDescription="@string/re_sync_clocks" />
<LinearLayout
android:layout_width="match_parent"
@@ -94,7 +98,7 @@
<TextView
style="@style/MenuTextTop"
- android:text="Re-sync clocks" />
+ android:text="@string/re_sync_clocks" />
</LinearLayout>
</LinearLayout>
@@ -109,7 +113,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_timelapse_black_24dp" />
+ app:srcCompat="@drawable/ic_timelapse_black_24dp"
+ android:contentDescription="@string/check_clock_drift" />
<LinearLayout
android:layout_width="match_parent"
@@ -119,11 +124,11 @@
<TextView
style="@style/MenuTextTop"
- android:text="Check clock drift" />
+ android:text="@string/check_clock_drift" />
<TextView
style="@style/MenuTextBottom"
- android:text="Check how much clocks diverged" />
+ android:text="@string/check_how_much_clocks_diverged" />
</LinearLayout>
@@ -139,7 +144,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_system_update_alt_black_24dp" />
+ app:srcCompat="@drawable/ic_system_update_alt_black_24dp"
+ android:contentDescription="@string/update_walt_firmware" />
<LinearLayout
android:layout_width="match_parent"
@@ -149,11 +155,11 @@
<TextView
style="@style/MenuTextTop"
- android:text="Update WALT Firmware" />
+ android:text="@string/update_walt_firmware" />
<TextView
style="@style/MenuTextBottom"
- android:text="Please press the button on the Teensy first" />
+ android:text="@string/please_press_the_button_on_the_teensy_first" />
</LinearLayout>
diff --git a/android/WALT/app/src/main/res/layout/fragment_drag_latency.xml b/android/WALT/app/src/main/res/layout/fragment_drag_latency.xml
index f9b65d0..a5e36c6 100644
--- a/android/WALT/app/src/main/res/layout/fragment_drag_latency.xml
+++ b/android/WALT/app/src/main/res/layout/fragment_drag_latency.xml
@@ -1,4 +1,5 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -19,21 +20,24 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tint="@color/button_tint"
- android:src="@drawable/ic_refresh_black_24dp" />
+ app:srcCompat="@drawable/ic_refresh_black_24dp"
+ android:contentDescription="@string/restart" />
<ImageButton
android:id="@+id/button_start_drag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tint="@color/button_tint"
- android:src="@drawable/ic_play_arrow_black_24dp" />
+ app:srcCompat="@drawable/ic_play_arrow_black_24dp"
+ android:contentDescription="@string/start" />
<ImageButton
android:id="@+id/button_finish_drag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tint="@color/button_tint"
- android:src="@drawable/ic_check_black_24dp" />
+ app:srcCompat="@drawable/ic_check_black_24dp"
+ android:contentDescription="@string/finish" />
</LinearLayout>
<FrameLayout
@@ -49,7 +53,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#000000"
- android:gravity="right"
+ android:gravity="end"
android:orientation="horizontal">
<TextView
@@ -92,11 +96,11 @@
android:id="@+id/button_close_chart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_alignParentTop="true"
+ android:layout_alignEnd="@id/latency_chart"
+ android:layout_alignTop="@id/latency_chart"
android:tint="@color/button_tint"
android:layout_margin="5dp"
- android:text="Close" />
+ android:text="@string/close" />
</RelativeLayout>
<TextView
diff --git a/android/WALT/app/src/main/res/layout/fragment_front_page.xml b/android/WALT/app/src/main/res/layout/fragment_front_page.xml
index ec3a95a..43ef542 100644
--- a/android/WALT/app/src/main/res/layout/fragment_front_page.xml
+++ b/android/WALT/app/src/main/res/layout/fragment_front_page.xml
@@ -1,4 +1,5 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
@@ -16,7 +17,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_search_black_24dp" />
+ app:srcCompat="@drawable/ic_search_black_24dp"
+ android:contentDescription="@string/diagnostics" />
<LinearLayout
android:layout_width="match_parent"
@@ -26,11 +28,11 @@
<TextView
style="@style/MenuTextTop"
- android:text="Diagnostics" />
+ android:text="@string/diagnostics" />
<TextView
style="@style/MenuTextBottom"
- android:text="TBD: Connection/sync status"
+ android:text="@string/tbd_connection_sync_status"
android:visibility="gone" />
@@ -47,7 +49,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_radio_button_checked_black_24dp" />
+ app:srcCompat="@drawable/ic_radio_button_checked_black_24dp"
+ android:contentDescription="@string/tap_latency" />
<LinearLayout
android:layout_width="match_parent"
@@ -57,7 +60,7 @@
<TextView
style="@style/MenuTextTop"
- android:text="Tap latency" />
+ android:text="@string/tap_latency" />
</LinearLayout>
</LinearLayout>
@@ -72,7 +75,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_swap_vert_black_24dp" />
+ app:srcCompat="@drawable/ic_swap_vert_black_24dp"
+ android:contentDescription="@string/drag_latency" />
<LinearLayout
android:layout_width="match_parent"
@@ -82,7 +86,7 @@
<TextView
style="@style/MenuTextTop"
- android:text="Drag latency" />
+ android:text="@string/drag_latency" />
</LinearLayout>
</LinearLayout>
@@ -97,7 +101,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_brightness_medium_black_24dp" />
+ app:srcCompat="@drawable/ic_brightness_medium_black_24dp"
+ android:contentDescription="@string/screen_response" />
<LinearLayout
android:layout_width="match_parent"
@@ -107,7 +112,7 @@
<TextView
style="@style/MenuTextTop"
- android:text="Screen response" />
+ android:text="@string/screen_response" />
</LinearLayout>
</LinearLayout>
@@ -122,7 +127,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_volume_up_black_24dp" />
+ app:srcCompat="@drawable/ic_volume_up_black_24dp"
+ android:contentDescription="@string/audio_latency" />
<LinearLayout
android:layout_width="match_parent"
@@ -132,7 +138,7 @@
<TextView
style="@style/MenuTextTop"
- android:text="Audio latency" />
+ android:text="@string/audio_latency" />
</LinearLayout>
</LinearLayout>
@@ -149,7 +155,8 @@
android:id="@+id/midi_image"
style="@style/MenuIconStyle"
android:tint="@color/ColorDisabled"
- android:src="@drawable/ic_music_note_black_24dp" />
+ app:srcCompat="@drawable/ic_music_note_black_24dp"
+ android:contentDescription="@string/midi_latency" />
<LinearLayout
android:layout_width="match_parent"
@@ -161,7 +168,7 @@
android:id="@+id/midi_text"
style="@style/MenuTextTop"
android:textColor="@color/ColorDisabled"
- android:text="MIDI latency" />
+ android:text="@string/midi_latency" />
</LinearLayout>
</LinearLayout>
@@ -176,7 +183,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_receipt_black_24dp" />
+ app:srcCompat="@drawable/ic_receipt_black_24dp"
+ android:contentDescription="@string/view_log" />
<LinearLayout
android:layout_width="match_parent"
@@ -186,7 +194,7 @@
<TextView
style="@style/MenuTextTop"
- android:text="View log" />
+ android:text="@string/view_log" />
</LinearLayout>
</LinearLayout>
@@ -194,6 +202,32 @@
<View style="@style/MenuDivider" />
+ <!-- Accelerometer -->
+ <LinearLayout
+ style="@style/MenuItemStyle"
+ android:onClick="onClickAccelerometer">
+
+ <ImageView
+ style="@style/MenuIconStyle"
+ app:srcCompat="@drawable/ic_swap_horiz_black_24dp"
+ android:contentDescription="@string/accelerometer_latency" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+
+ <TextView
+ style="@style/MenuTextTop"
+ android:text="@string/accelerometer_latency" />
+
+ </LinearLayout>
+ </LinearLayout>
+ <!-- End of Accelerometer -->
+
+ <View style="@style/MenuDivider" />
+
<!-- Settings -->
<LinearLayout
style="@style/MenuItemStyle"
@@ -201,7 +235,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_settings_black_24dp" />
+ app:srcCompat="@drawable/ic_settings_black_24dp"
+ android:contentDescription="@string/settings" />
<LinearLayout
android:layout_width="match_parent"
@@ -211,7 +246,7 @@
<TextView
style="@style/MenuTextTop"
- android:text="Settings" />
+ android:text="@string/settings" />
</LinearLayout>
@@ -227,7 +262,8 @@
<ImageView
style="@style/MenuIconStyle"
- android:src="@drawable/ic_help_outline_black_24dp" />
+ app:srcCompat="@drawable/ic_help_outline_black_24dp"
+ android:contentDescription="@string/about" />
<LinearLayout
android:layout_width="match_parent"
@@ -237,7 +273,7 @@
<TextView
style="@style/MenuTextTop"
- android:text="About" />
+ android:text="@string/about" />
</LinearLayout>
</LinearLayout>
diff --git a/android/WALT/app/src/main/res/layout/fragment_midi.xml b/android/WALT/app/src/main/res/layout/fragment_midi.xml
index 70f9be5..fba287f 100644
--- a/android/WALT/app/src/main/res/layout/fragment_midi.xml
+++ b/android/WALT/app/src/main/res/layout/fragment_midi.xml
@@ -21,7 +21,8 @@
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:tint="@color/button_tint"
- android:src="@drawable/ic_input_black_24dp" />
+ walt:srcCompat="@drawable/ic_input_black_24dp"
+ android:contentDescription="@string/start_midi_in" />
<ImageButton
android:id="@+id/button_start_midi_out"
@@ -29,7 +30,8 @@
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:tint="@color/button_tint"
- android:src="@drawable/ic_output_black_24dp" />
+ walt:srcCompat="@drawable/ic_output_black_24dp"
+ android:contentDescription="@string/start_midi_out" />
</RelativeLayout>
<org.chromium.latency.walt.HistogramChart
diff --git a/android/WALT/app/src/main/res/layout/fragment_screen_response.xml b/android/WALT/app/src/main/res/layout/fragment_screen_response.xml
index b789579..fc7c107 100644
--- a/android/WALT/app/src/main/res/layout/fragment_screen_response.xml
+++ b/android/WALT/app/src/main/res/layout/fragment_screen_response.xml
@@ -20,24 +20,26 @@
android:id="@+id/button_stop_screen_response"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:tint="@color/button_tint"
- android:src="@drawable/ic_stop_black_24dp" />
+ walt:srcCompat="@drawable/ic_stop_black_24dp"
+ android:contentDescription="@string/stop" />
<ImageButton
android:id="@+id/button_start_screen_response"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:tint="@color/button_tint"
- android:src="@drawable/ic_play_arrow_black_24dp" />
+ walt:srcCompat="@drawable/ic_play_arrow_black_24dp"
+ android:contentDescription="@string/start" />
<Spinner
android:id="@+id/spinner_screen_response"
android:layout_height="45dp"
android:layout_width="fill_parent"
- android:layout_toRightOf="@id/button_stop_screen_response"
- android:layout_toLeftOf="@id/button_start_screen_response"
+ android:layout_toEndOf="@id/button_stop_screen_response"
+ android:layout_toStartOf="@id/button_start_screen_response"
android:prompt="@string/screen_response_mode"/>
</RelativeLayout>
diff --git a/android/WALT/app/src/main/res/layout/fragment_tap_latency.xml b/android/WALT/app/src/main/res/layout/fragment_tap_latency.xml
index 2c701d2..28f4327 100644
--- a/android/WALT/app/src/main/res/layout/fragment_tap_latency.xml
+++ b/android/WALT/app/src/main/res/layout/fragment_tap_latency.xml
@@ -18,17 +18,19 @@
android:id="@+id/button_finish_tap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:tint="@color/button_tint"
- android:src="@drawable/ic_check_black_24dp" />
+ walt:srcCompat="@drawable/ic_check_black_24dp"
+ android:contentDescription="@string/finish" />
<ImageButton
android:id="@+id/button_restart_tap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:tint="@color/button_tint"
- android:src="@drawable/ic_play_arrow_black_24dp" />
+ walt:srcCompat="@drawable/ic_play_arrow_black_24dp"
+ android:contentDescription="@string/restart" />
</RelativeLayout>
<FrameLayout
@@ -44,7 +46,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#000000"
- android:gravity="right"
+ android:gravity="end"
android:orientation="horizontal">
<TextView
diff --git a/android/WALT/app/src/main/res/layout/histogram.xml b/android/WALT/app/src/main/res/layout/histogram.xml
index ca6dc1e..bdbda12 100644
--- a/android/WALT/app/src/main/res/layout/histogram.xml
+++ b/android/WALT/app/src/main/res/layout/histogram.xml
@@ -15,9 +15,9 @@
android:id="@+id/button_close_bar_chart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_alignParentTop="true"
+ android:layout_alignTop="@id/bar_chart"
+ android:layout_alignEnd="@id/bar_chart"
android:tint="@color/button_tint"
android:layout_margin="5dp"
- android:text="Close" />
+ android:text="@string/close" />
</RelativeLayout>
diff --git a/android/WALT/app/src/main/res/layout/line_chart.xml b/android/WALT/app/src/main/res/layout/line_chart.xml
index 7de4cfb..a846a13 100644
--- a/android/WALT/app/src/main/res/layout/line_chart.xml
+++ b/android/WALT/app/src/main/res/layout/line_chart.xml
@@ -15,9 +15,9 @@
android:id="@+id/button_close_chart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_alignParentTop="true"
+ android:layout_alignTop="@id/chart"
+ android:layout_alignEnd="@id/chart"
android:tint="@color/button_tint"
android:layout_margin="5dp"
- android:text="Close" />
+ android:text="@string/close" />
</RelativeLayout>
diff --git a/android/WALT/app/src/main/res/layout/toolbar.xml b/android/WALT/app/src/main/res/layout/toolbar.xml
index d02028d..c932cdb 100644
--- a/android/WALT/app/src/main/res/layout/toolbar.xml
+++ b/android/WALT/app/src/main/res/layout/toolbar.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
-<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@color/ColorPrimary"
android:elevation="4dp">
-</android.support.v7.widget.Toolbar> \ No newline at end of file
+</androidx.appcompat.widget.Toolbar> \ No newline at end of file
diff --git a/android/WALT/app/src/main/res/menu/menu_main.xml b/android/WALT/app/src/main/res/menu/menu_main.xml
index 6333e6d..e34957b 100644
--- a/android/WALT/app/src/main/res/menu/menu_main.xml
+++ b/android/WALT/app/src/main/res/menu/menu_main.xml
@@ -7,21 +7,21 @@
<item
android:id="@+id/action_upload"
android:orderInCategory="180"
- android:title="Upload"
+ android:title="@string/upload"
android:icon="@drawable/ic_file_upload_black_24dp"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_share"
android:orderInCategory="190"
- android:title="Share"
+ android:title="@string/share"
android:icon="@drawable/ic_share_black_24dp"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_help"
android:orderInCategory="200"
- android:title="Help"
+ android:title="@string/help"
android:icon="@drawable/ic_help_outline_black_24dp"
app:showAsAction="ifRoom" />
diff --git a/android/WALT/app/src/main/res/raw/walt.hex b/android/WALT/app/src/main/res/raw/walt.hex
index 21fccf6..daaa3ec 100644
--- a/android/WALT/app/src/main/res/raw/walt.hex
+++ b/android/WALT/app/src/main/res/raw/walt.hex
@@ -1,16 +1,16 @@
-:1000000000180020C100000069250000352500000F
-:100010003525000035250000352500003525000078
-:100020003525000035250000352500006925000034
-:100030006925000035250000692500002525000000
-:100040006925000069250000692500006925000078
-:100050006925000069250000692500006925000068
-:100060006925000069250000692500006925000058
-:10007000A92B000049300000E1350000692500008F
-:100080006925000069250000692500006925000038
-:100090006925000069250000013B0000692500007A
-:1000A0004113000069250000692500006925000052
-:1000B0006925000069250000692500006925000008
-:1000C00038B502F055FA454A454B1A60454A464B49
+:1000000000180020C1000000F1250000BD250000FF
+:10001000BD250000BD250000BD250000BD25000058
+:10002000BD250000BD250000BD250000F125000014
+:10003000F1250000BD250000F1250000AD250000E0
+:10004000F1250000F1250000F1250000F125000058
+:10005000F1250000F1250000F1250000F125000048
+:10006000F1250000F1250000F1250000F125000038
+:10007000312C0000D130000069360000F12500006D
+:10008000F1250000F1250000F1250000F125000018
+:10009000F1250000F1250000893B0000F12500005A
+:1000A000C9130000F1250000F1250000F125000032
+:1000B000F1250000F1250000F1250000F1250000E8
+:1000C00038B502F099FA454A454B1A60454A464B05
:1000D0001A60464A464B1A60464B0822197811426C
:1000E00002D019780A431A70434B2A221A7000234F
:1000F000424A43499A188A4204D24249C9580433B1
@@ -26,11 +26,11 @@
:10019000FCD52549254A1160224A20211170997900
:1001A0000C220A400C2AFAD1214A224B1A60224A18
:1001B000224B1A60224B00221A60224B07221A603F
-:1001C000214A224B1A6062B600F092FF04F044FB11
-:1001D00002F0D4F902F04CF9FEE7C046300004F01A
+:1001C000214A224B1A6062B600F0D6FF04F088FB89
+:1001D00002F018FA02F090F9FEE7C046300004F091
:1001E00034800440823F0000388004400100000F4A
:1001F0003C80044002D0074000E00740700200202D
-:10020000600400205055000064040020D80800203D
+:1002000060040020D855000064040020D8080020B5
:100210000000000000F9FF1F00E400E008ED00E02E
:100220000050064000400640000001104480044099
:10023000C0000505048004407FBB000014E000E01E
@@ -65,1333 +65,1342 @@
:10040000FFFFFFFFFFFFFFFFFFFFFFFFDEF9FFFF23
:1004100010B5064C2378002B07D1054B002B02D0DA
:10042000044800E000BF0123237010BD60040020D9
-:10043000000000005055000008B5084B002B03D009
+:1004300000000000D855000008B5084B002B03D081
:100440000748084900E000BF07480368002B03D0B5
:10045000064B002B00D0984708BDC04600000000A6
-:1004600050550000640400206004002000000000DB
-:1004700010B5041C00F0FEFD2368C01A10BDFFFF7C
+:10046000D855000064040020600400200000000053
+:1004700010B5041C00F042FE2368C01A10BDFFFF37
:1004800010B50948FFF7F4FF084C20600E2000F07B
-:100490009BFDA36841424141C9B201330C20616018
-:1004A000A36000F071FD10BD100500209C04002029
-:1004B00008B5011C014801F0CFFF08BDEC04002085
-:1004C00008B5011C014801F0C0FF08BDEC04002084
-:1004D00000B58DB0021C084904A804F0D1FA04A9A3
-:1004E000684601F033FF6846FFF7EAFF684601F00F
-:1004F000E9FE0DB000BDC0460C51000000B58DB046
-:10050000021C084904A804F0BBFA04A9684601F0DB
-:100510001DFF6846FFF7D4FF684601F0D3FE0DB01B
-:1005200000BDC0461051000030B5134B85B01D789A
-:10053000124C002D0AD02068A16801F0EFFA01F0FA
-:100540001FFB201CF02101F03BFF12E00C48A268C9
-:10055000036821685B68984701F042FD291C6846E2
-:1005600001F0F4FE201C694601F022FF684601F00C
-:10057000A9FE05B030BDC0460C050020EC040020EB
+:10049000DFFDA36841424141C9B201330C206160D4
+:1004A000A36000F0B5FD10BD100500209C040020E5
+:1004B00008B5011C014802F013F808BDEC04002047
+:1004C00008B5011C014802F004F808BDEC04002046
+:1004D00000B58DB0021C084904A804F015FB04A95E
+:1004E000684601F077FF6846FFF7EAFF684601F0CB
+:1004F0002DFF0DB000BDC0469451000000B58DB079
+:10050000021C084904A804F0FFFA04A9684601F097
+:1005100061FF6846FFF7D4FF684601F017FF0DB092
+:1005200000BDC0469851000030B5134B85B01D7812
+:10053000124C002D0AD02068A16801F033FB01F0B5
+:1005400063FB201CF02101F07FFF12E00C48A26841
+:10055000036821685B68984701F086FD291C68469E
+:1005600001F038FF201C694601F066FF684601F083
+:10057000EDFE05B030BDC0460C050020EC040020A7
:100580009806002008B5054B0A201B78002B00D0E8
:10059000F720FFF78DFFFFF7C7FF08BD0C05002010
:1005A00010B5141CCAB01A0CD2B2031C00910194ED
-:1005B0000AA8084904F064FA0AA906A801F0C6FED0
-:1005C00006A8FFF77DFF06A801F07CFEFFF7DAFF23
-:1005D0004AB010BD14510000031C413B192B01D837
+:1005B0000AA8084904F0A8FA0AA906A801F00AFF47
+:1005C00006A8FFF77DFF06A801F0C0FEFFF7DAFFDF
+:1005D0004AB010BD9C510000031C413B192B01D8AF
:1005E000203004E0031C613B192B01D82038C0B235
:1005F000704708B5FFF7F0FFFFF75AFFFFF7C2FF9C
:1006000008BDFFFF10B5054C0021201C2C2204F072
-:1006100075F901235B42636010BDC046BC04002035
+:10061000B9F901235B42636010BDC046BC040020F1
:1006200010B572B6FFF7EEFF00240D4B0021E05825
-:100630001022043404F062F9142CF6D1094B4C2238
+:100630001022043404F0A6F9142CF6D1094B4C22F4
:100640009A73094B53229A73084B47229A73084BAB
:1006500041229A73074B4D229A7362B610BDC04671
:10066000740200209C04002014050020FC040020DB
:10067000AC0400207C04002010B50B20012100F008
-:10068000B5FC0C20012100F0B1FC0D20012100F08F
-:10069000ADFC1420002100F0A9FC0F20002100F087
-:1006A000A5FC0E20022100F0A1FC0E200C49042222
-:1006B00000F02CFC0B4B00221A700124FFF7B0FF56
-:1006C000094B211C0D201C7000F05EFC211C0B202E
-:1006D00000F05AFC0C20211C00F056FC10BDC04656
-:1006E000810400000C050020E804002030B50B2038
-:1006F00085B0012100F048FCFA24A400142000F089
-:1007000057FB051C1248FFF7B3FEFFF7E1FE202060
-:10071000FFF7CEFE28B2FFF7DBFEFFF733FFE12342
-:100720005B01013BFDD1013C002CE7D1211C0B20DA
-:1007300000F02AFC0749684601F008FE6846FFF70A
-:10074000BFFE684601F0BEFDFFF71CFF05B030BDDF
-:1007500010050020235100007FB5041E5A2C16D12D
-:1007600072B600F087FCB14B1860FFF74BFFB04B3F
-:1007700001221A7062B60025AE4B291C0B201D7099
-:1007800000F002FC0C20291C00F0FEFBECE05428D9
-:100790000FD1A949684601F0D9FD6846FFF790FEE0
-:1007A000684601F08FFDA148FFF762FEFFF7A6FE45
-:1007B00039E1502800D1D7E0442803D10A2000F0C5
-:1007C0007DFCD1E0031C313B082B0AD89748FFF78A
-:1007D0004FFE2F3C964B0122A4005242E0505A603B
-:1007E00023E1522811D1924A00245368591C5160C8
-:1007F000082902DCD91C89008C58981CFFF768FE78
-:100800003A20FFF755FE201CFDE0492819D1884BFE
-:10081000012252425A6000241D1C884B013BFDD12D
-:100820008248FFF725FEA300EB189860201C3130AA
-:10083000C0B20134FFF73CFEFFF7A4FE092CECD157
-:10084000F3E0462802D1FFF7EBFE8DE0562811D1E8
-:10085000FFF7C2FEFFF72CFE2020FFF729FE7849A4
-:10086000684601F073FD6846FFF72AFE684601F00E
-:1008700029FDD8E047280BD1724C2068FFF728FEED
-:10088000FFF780FE00232360A36001232373CCE0E5
-:10089000412801D16C4B1DE0422812D16348FFF77B
-:1008A000E7FD6A490022051C172001F049FC201CC5
-:1008B000FFF792FEFFF7FCFD2020FFF7F9FD281C53
-:1008C000A1E0532803D1172001F0CEFC4CE04D28C5
-:1008D00006D15F4B00221A609A6001221A7342E02F
-:1008E0004E2820D1514E5B4A316868468B180093E0
-:1008F000FFF7BEFD051C201CFFF76EFEFFF7D8FDBD
-:100900002020FFF7D5FD281CFFF7F8FDFFF73AFE82
-:10091000301CFFF7ADFDA842FAD34F4801F0B4F800
-:1009200001F02EF981E043280ED1142000F040FAA6
-:100930004A4C0123191C221C6E2800DC0023636032
-:1009400051731173432017E0632804D1434B0022F5
-:100950005A731A7308E0452801D1404C12E04C2824
-:1009600004D13F4B01225A73201C05E06C2806D1AC
-:100970003B4B00225A736C20FFF73BFE55E04A28A0
-:1009800009D1374CE36820686168A268FFF708FE68
-:100990000023A36049E0552804D1FFF72AFEFFF7A2
-:1009A000A5FE42E0512831D1FFF716FEFFF780FD8A
-:1009B0002C49684601F0CAFC6846FFF781FD68468D
-:1009C00001F080FC0F2000F0F3F9FFF781FD2649CC
-:1009D000684601F0BBFC6846FFF772FD684601F00F
-:1009E00071FC142000F0E4F9FFF772FD1F4968461E
-:1009F00001F0ACFC6846FFF763FD684601F062FC5D
-:100A00000E2000F0D5F9FFF763FD0CE018496846A9
-:100A100001F09CFC6846FFF753FD684601F052FC6C
-:100A2000201CFFF745FDFFF7ADFD7FBD1005002041
-:100A3000BC040020E804002027510000102E000014
-:100A40002A510000FC040020AC04002088130000A0
-:100A50007C040020F0D8FFFF09903C6314050020BF
-:100A60009C0400202C510000305100003C5100003B
-:100A700047510000F0B5624C87B021780D2000F09E
-:100A800083FA604D2B7B002B13D00F2000F090F9E0
-:100A9000E1239B0098420CDD5B48FFF7E9FCAB6863
-:100AA00001220133AB6000232B732378286053406D
-:100AB0002370564D2B7B002B11D0162000F078F9B7
-:100AC00014280CDD5048FFF7D3FCAB68012201333A
-:100AD000AB6000232B7323782860534023700120E0
-:100AE00001F068F8061C701E8641F6B20196002ED1
-:100AF00007D0474D2B7B002B03D0464B1F78002F90
-:100B00006ED0454D2B7B002B19D0142000F050F9EE
-:100B10006968002902D16E2802DC10E059280EDC39
-:100B20003948FFF7A5FCAB6801220133AB6023789D
-:100B30006E68534023707342734128606B600024D9
-:100B400072B6364B0021E3585A7B8A420BD09F681D
-:100B50008F4208DD324A1D1C101CC4CDC4C02D6854
-:100B600005609960012162B6002906D02C4B1868F7
-:100B700059689A68DB68FFF713FD0434142CDFD141
-:100B8000019E002E22D0234B1B78042B18D1254B1D
-:100B900002A8197801394B425941234BC9B2197047
-:100BA000002903D0F02101F015FC01E001F0CEFB9B
-:100BB00002A91E4801F0FCFB02A801F083FB05E03E
-:100BC000052B03D1174B1878FFF7C6FD01F066F926
-:100BD000002812D001F01AF9C0B2FFF7BDFD0CE0F9
-:100BE0000948FFF745FCAB6801220133AB6023786D
-:100BF000286053402F73237083E707B0F0BDC046D1
-:100C0000E8040020FC04002010050020AC040020B3
-:100C10007C040020860800201405002074020020B7
-:100C20008C040020880800200C050020EC04002023
-:100C300010B500F01FFA064B064C18600021201C6E
-:100C400001F084FB201C0449044A03F0EDFD10BDB3
-:100C500010050020EC040020C522000070020020D6
-:100C6000F0B51E4B1A6880231A40FAD172B61C4B9D
-:100C70001978002930D01B490C681B490F681B49A3
-:100C80003C190E681A49A4190D681A4964190868B4
-:100C900019492418096819486418A4B21849640845
-:100CA0000C43A4B20460174C174800682568174C21
-:100CB000AC462768164C60442668164CC019256857
-:100CC000154C801924684019001980B2400801436E
-:100CD000124889B201601A7062B6F0BD24B00340B8
-:100CE0002505002038B003403CB0034040B003402D
-:100CF00044B0034048B003404CB003402CB0034024
-:100D00000080FFFF5CB0034058B0034060B0034078
-:100D100064B0034068B003406CB0034030B003409F
-:100D20001B4B1C4A19781C4B082901D1002102E0F9
-:100D30000A2903D138211160132206E00C2901D1C0
-:100D4000342100E03C21116012221A60134B1A7802
-:100D5000134B002A01D0002200E001221A60114B3F
-:100D60001A78114B012A01D880220CE0042A01D8FC
-:100D7000842208E0082A01D8852204E0102A01D83C
-:100D8000862200E087221A60084B01221A70704701
-:100D90008802002008B003400CB003402705002063
-:100DA00020B003408902002024B003402505002024
-:100DB000031C70B50020272B32D81A4AD45CFF2CB4
-:100DC0002ED0194B1B78834201D0FFF749FF72B632
-:100DD000164B1022610605D51968914319603F230F
-:100DE0001C4002E019680A431A60114B114D0122A0
-:100DF0001C602A7062B61E1C72B633681A0608D5CB
-:100E00000D4B186800232B7062B60C4B1B781841F1
-:100E100006E02B78002BDBD062B601F05FFBEBE73E
-:100E200070BDC04659510000250500200CB003409C
-:100E300000B003402605002010B003402405002028
-:100E40007047FFFF38B5074B1C681C60064BDA681B
-:100E50001D1CA30700D590472B69620700D5984752
-:100E600038BDC046A09004408C02002038B5244B09
-:100E7000244C1D681D60636A2A0700D59847A36A41
-:100E8000EA0600D59847E36A6A0600D59847236BBF
-:100E90002A0600D59847636BAA0600D59847E36BEE
-:100EA000EA0700D59847A36DAA0700D59847E36DD8
-:100EB0006A0700D59847144B1D681D60A368EA07B0
-:100EC00000D5984763692A0600D59847A369EA06C2
-:100ED00000D59847E3696A0700D59847236A2A072F
-:100EE00000D59847A36BAA0700D59847236DAA069B
-:100EF00000D59847636D6A0600D5984738BDC0464F
-:100F0000A0B004408C020020A0C0044070B5041EB4
-:100F10001A2C2CD8042A2AD8101C02F0BDFE07096E
-:100F2000050B03000B2306E00A2304E0082302E07C
-:100F30000C2300E009230C2262430D480D4E821859
-:100F40000D485268051CB8352E600C4DBC3005604C
-:100F500072B60B481568A40028400A4D1060615114
-:100F60008021490408431B041843106062B670BD19
-:100F700084510000450E000000F9FF1F6D0E0000B7
-:100F8000FFFFF0FF8C02002010B51A2818D80C23A0
-:100F900058430C4A835810181C7D027A224205D00F
-:100FA000002901D01A710BE01A7209E043681A682F
-:100FB000002902D003210A4301E002218A431A607A
-:100FC00010BDC0468451000000231A280AD80C2303
-:100FD0005843054A81581018027A0B7C13405A1E58
-:100FE0009341DBB2181C704784510000F0B51A28F9
-:100FF0003DD80C273D1C45431D4A54196368161CF7
-:10100000012901D0042912D1784332583018147DB7
-:10101000007A20431075A22252001A60202204296F
-:1010200001D1196814E0196891430A1C1EE0AA58FE
-:10103000247A107DA0431075002902D08A1E012A4F
-:1010400012D8802252001A60022903D11A680321A3
-:101050000A430BE003290AD11A6802210A431A60E5
-:101060001A6801218A4301E00422FF321A60F0BDB0
-:101070008451000072B60C4B0C491A680C4B1B686B
-:10108000096862B6480104D532219142894149423A
-:101090005B18FA20800043430648821A0648424300
-:1010A000920D98187047C04618E000E004ED00E08B
-:1010B000280500207FBB00005555010038B5041CF1
-:1010C000FFF7D8FF051C002C0FD0FFF7D3FF074B0D
-:1010D000401B984206D9013C002C06D0FA239B0005
-:1010E000ED18F2E701F0FAF9EFE738BDE703000089
-:1010F0001D4B8022D20510B51A60802212061A609C
-:101100001A4B002018601A491A4B1B4A19602823F1
-:1011100013601A4A1A4C13601A4A13601A4A136071
-:101120001A4A13601A4A136009222260194C20607F
-:10113000194C2160194C2360194C2360194C226012
-:10114000194C20601948016019490B6019490B605E
-:10115000194B1A60FFF7E4FDC8204000FFF7AEFF0F
-:1011600000F0D8FB10BDC04600E100E00480034061
-:10117000FFBF0000088003400C8003401480034040
-:10118000008003401C800340248003402C800340E7
-:101190003480034004900340089003400C900340C7
-:1011A000149003400090034004A0034008A00340B3
-:1011B0000CA0034014A0034000A00340F0B50B4F67
-:1011C00002223B780A4E1A43D2000A4DB4186060DE
-:1011D00028788824002800D0C82409040C43B4507F
-:1011E00001225040534028703B70F0BDA005002004
-:1011F00000F8FF1F20060020431E10B5042B0FD857
-:1012000072B6084A99008858002807D044685B00E5
-:101210008C50054A01889C5A611A995262B600E0C6
-:10122000002010BD8C0500207C080020431E0020FB
-:10123000042B09D872B6054A9B009B58002B02D09C
-:1012400001305B68FAE762B67047C046E4050020EB
-:1012500038B572B60123164A9A18013A1278110766
-:101260001CD5144A5C01A5589900002D05D113190D
-:1012700008305860104BA3500AE001242143C900F4
-:101280008C58002C0AD15318083058600B4B8B50E7
-:101290000B4B1A78013A1A7062B608E00133062B3C
-:1012A000D9D162B6064B00221A7000F0A7FB38BDF8
-:1012B000F052000000F8FF1F88004000C800400006
-:1012C00016060020421E10B5042A30D802238000E2
-:1012D0001843174BC0001B1872B6164CA05C0328AD
-:1012E00009D802F0D9FC140216050833022011E0D7
-:1012F000083304200EE01048920014580F4B002CC5
-:1013000001D1115001E09858416099500EE003203E
-:1013100000E00520A0540A1C08325A6088221807F1
-:1013200000D5C822098809040A431A6062B610BDB4
-:1013300000F8FF1F44050020E4050020F805002008
-:10134000F7B5B6490C780E1CE4B262071FD5B44B52
-:101350001B78002B18D0B34A1378DBB2002B05D0D2
-:10136000013BDBB21370002B00D100BEAE4A1378F4
-:10137000DBB2002B06D0013BDBB21370002B01D196
-:1013800000F05CFE00F0FCFBA44D04232B7008254C
-:10139000221C2A4000D154E2A44BA54C1B78DBB29E
-:1013A0001E099A08002E00D0DDE1D50065192F68CE
-:1013B0006A68B806000F01380C2800D9D0E102F0A5
-:1013C00075FC93019301CF01CF01CF01CF01CF0174
-:1013D000CF01AC01CF01CF01CF010D0095491368BA
-:1013E000954F526895482960954D964900263B6077
-:1013F0007A609BB201222E602661A66102708B4248
-:1014000018D8D021C9008B4200D3E5E0812191405A
-:101410008B4200D1C2E006D8802B00D1A9E0822BFC
-:1014200000D1ABE0F5E0884A934200D1C5E0A022AC
-:10143000D20017E085498B4200D152E10DD88821B6
-:1014400009018B4200D18EE090221201934200D01C
-:10145000DFE0BA78724B1A7009E07D4A934200D1FE
-:10146000CFE07C4A0026934200D115E1D1E0A319D8
-:10147000196A090603D5586A083800F0BFFA083619
-:10148000A02EF4D100252E1C734AA858002805D0A0
-:101490004368019300F0B2FA0198F7E76E496F4B89
-:1014A0006F4A4851E850A858002805D04368019376
-:1014B00000F0A4FA0198F7E76A4B6B4AE850730012
-:1014C000D0526749694B4851F05C0238032807D86D
-:1014D00002F0E2FB02040204002200E001229A551D
-:1014E00001360435052ECFD1614A00231370012542
-:1014F000161C604BEA18604B9200EB18013B1B78FE
-:101500001370190720D500F05BFA6B01002805D095
-:10151000E21808305060594AE25003E0E050337856
-:101520000133337000F04CFA0122AB001343DB00AF
-:10153000002805D0E218083050603E4AE25003E02F
-:10154000E050337801333370AB0002221A43D200EB
-:101550000021A1500322134393400135E150062D91
-:10156000C7D10E1C98E02E4B454C1B78161C2370DF
-:1015700093E0434C2670667002268EE0BB88052BF4
-:1015800047D83F4C3F4D9B00267066705B191B7817
-:101590000226334200D180E022707EE0BA887F23A9
-:1015A0001340052B35DC7E88002E32D135499B0057
-:1015B0005B181A7802218A4329E0BA887F231340F6
-:1015C000052B26DC7E88002E23D12E4A9B009B18FB
-:1015D0001A7802210A431AE07A88B9882A4B5C6893
-:1015E000002C16D01888904209D15888884206D11C
-:1015F000120A032A01D126784FE01E894DE00C33F0
-:10160000EDE7224B1A68224B1A60BA78214B1A7008
-:1016100042E01C4B0F221A7063E0C0468020074056
-:101620001F060020A10500205C0600209020074036
-:1016300000F8FF1FC80040000C0600202006002014
-:101640002C0500208106000002030000212000007C
-:1016500021220000212300008C05002030050020FD
-:10166000E4050020F80500207C0800204405002047
-:101670001606002030C80110F0520000880040001B
-:1016800017060020C0200740F8520000280500205F
-:10169000D00800206C060020341CFB889E4200D934
-:1016A0001E1C371E402F00D94027201C391CFFF775
-:1016B00085FDE419F61B03D1351C402F04D010E042
-:1016C0004025B54200D9351C201C291CFFF776FDAA
-:1016D0006419761B01D1402D03D1754D754B2C60DB
-:1016E0001E800122744B3AE0744B1988744B994266
-:1016F00010D10023D05C7349C8540133072BF9D1B2
-:101700000B68862B02D1704B0F221A700020011C2F
-:10171000FFF754FD6D4B2B6022E0654F3D68002DB7
-:1017200013D064490E88341E402C00D94024281C54
-:10173000211CFFF743FD361B5E4AB6B21680002E11
-:1017400001D1402C00D12E193E605C4BA02219889B
-:10175000D200914204D100225A709A785C4B1A70E0
-:101760000122554B61E0D200A4186068013E0838A0
-:10177000F6B22B4036D000F041F95649B00042583D
-:10178000554B002A1BD055684550111C985D0831F7
-:10179000616003280BD802F07FFA020406080321D7
-:1017A00004E0022102E0052100E00421995588238C
-:1017B000270700D5C8231288120413433CE0985D24
-:1017C000032808D802F068FA39390204002200E040
-:1017D00001229A5531E02C40624262410324A41A4E
-:1017E0009C552AE062880280002A20D03B4D43802D
-:1017F0004360B3005F593A49002F01D1585101E0CD
-:10180000CD586860C850374B7600F15A5218F252E2
-:1018100000F0D6F8002804D00830606021070AD50F
-:1018200007E0314B20601A7801321A7005E02C4233
-:1018300001D0264B00E02D4B23602D4A0823137066
-:101840007FE5012004421ED01B4902230B70294B67
-:10185000264C1A70284B294D1C609C60284C1A613C
-:10186000DC609A615D60274B0D241C70264CFF23C1
-:101870002370174C33702270244A1370244B9F221C
-:101880001A70087013E063B2002B04DA1D4B0D22AE
-:101890001A708023337002231C4204D01A4A117834
-:1018A000C9B21170337010231C4200D03370F7BDE1
-:1018B0002C05002014060020942007400C06002070
-:1018C00021200000C8080020A1050020C800400019
-:1018D00098200740E4050020440500208C050020E6
-:1018E000300500207C0800201606002088004000FB
-:1018F00080200740A005002000F8FF1F4C050020B5
-:10190000A4050020C0200740882007408C20074005
-:101910008420074010B501F0D9FE00221A4B0021A7
-:10192000D150981808324160A82AF7D1174A802070
-:101930001468C00220431060180A154AC0B2107023
-:10194000180C144AC0B21070134A1B0E1370134ABD
-:10195000FF231370124A13481370134A13700122A5
-:1019600002701248017012490A70124A11689943B4
-:101970000B1C70210B4313600F4B802252041A6022
-:101980000E4B10221A7010BD00F8FF1F3480044067
-:101990009C200740B0200740B4200740802007402B
-:1019A000882007409420074010200740002107406E
-:1019B0008420074018E400E000E100E0082107402F
-:1019C00038B572B60B4C2568281C02F003FA1D28A6
-:1019D00002D962B600200CE080231B06C3409D4361
-:1019E000256062B648235843034B18180023036050
-:1019F000436038BDF802002000FAFF1F10B5041C38
-:101A00000E484821201A02F05BF91D2815D80C4B0E
-:101A10001B78002B07D00B4B1B78002B03D0201C0E
-:101A2000FFF716FC09E072B68022074B1206C2408F
-:101A3000101C1A681043186062B610BD00FAFF1F30
-:101A4000160600201F060020F802002038B50B4CB7
-:101A5000051C21783C2908D1094B1B68002B04D0B8
-:101A60000848002298470023237023783B2B03D893
-:101A70005A1C2270034AD55438BDC046870800203E
-:101A80004C0600208B080020F8B51F4D1F4C012389
-:101A90002B702368061C002B1DD11D4F1D4B1B787E
-:101AA000002B2FD00420FFF7C1FB052804D9013FEC
-:101AB000194B002F06D108E0FFF782FF20600028B5
-:101AC000F5D008E01A78002A02D001221A7019E035
-:101AD00000F004FDE2E7104B002221681A704A88EA
-:101AE000531C92008A1896600F2B01D84B8007E098
-:101AF00040230B800420FFF7E5FBFFF761FF206028
-:101B000000232B70F8BDC0463C0600204406002090
-:101B1000E14200001F0600204806002038B5041CE2
-:101B20000D1C032D0ED92078637800021B04184386
-:101B300004231843A378033D1B061843FFF7A4FFB3
-:101B40000334EEE7032D09D12078637800021B04EB
-:101B5000184307231843A3781B060DE0022D06D176
-:101B60002078637800021B041843062304E0012D4B
-:101B700005D12078052300021843FFF785FF38BD03
-:101B800010B50A4B1B78002B0ED1094C2168002997
-:101B90000AD04B88002B07D09B000B800420FFF756
-:101BA00091FBFFF70DFF206010BDC0463C060020F2
-:101BB00044060020F8B5834C071C2368251C002B25
-:101BC00012D1814B1B78002B00D1E2E00520FFF7FA
-:101BD00013FB2060002800D1DBE00688002E03D133
-:101BE000FFF70CFF2660D4E0286843889A0892002B
-:101BF0008218946802880433934201D2438005E03E
-:101C0000FFF7FCFE0520FFF7F7FA28600F23251CDD
-:101C10001D40200A061C2A1C1E40083A0136062ACE
-:101C200000D980E0002F02D0B74200D0B1E0220BF3
-:101C30001340082D0AD1082B00D0AAE0634B0022E4
-:101C40001A70634B1B68934232D163E0092D1AD19D
-:101C5000092B00D09DE0220E5C4B210C002A09D0FC
-:101C6000012018705B4B1B68002B53D0F0B2C9B237
-:101C7000D2B206E01A70564B1B68002B4AD0F0B265
-:101C8000C9B2984746E00A2D07D10A2B00D080E060
-:101C90004E4B02221A70504B07E00B2D0DD10B2B2F
-:101CA00077D14A4B03221A704C4B1B68002B31D062
-:101CB000210CF0B2C9B2220EE3E70C2D06D10C2B99
-:101CC00067D1424B04221A70454B07E00D2D0DD110
-:101CD0000D2B5ED13D4B05221A70424B1B68002B29
-:101CE00018D0210CF0B2C9B2984713E00E2D50D194
-:101CF0000E2B4ED1354B06221A703B4B1B68002B26
-:101D000008D0FE21620C890111406202520EF0B22D
-:101D100011439847354B220C1E70354B240E1A7018
-:101D2000344B1C704CE0042D08D1C0B2FFF78EFE7E
-:101D3000200CC0B2FFF78AFE200E28E06B1F022B9A
-:101D40001ED8C0B2FFF782FE052D08D0200CC0B20D
-:101D5000FFF77CFE072D02D1200EFFF777FE264B02
-:101D6000234A1978117000221A70184B07221A7032
-:101D7000224B1B68002B23D02148012298471FE0EB
-:101D80000F2D12D11C4B1B78002B04D0C0B2FFF7D3
-:101D90005DFE002015E00D4B08221A70194B1B68E0
-:101DA000002BB7D0C0B29847B4E7022DF1D1074B52
-:101DB00009221A70144B1B68002B01D0200C984785
-:101DC0000120F8BD500600201F06002086080020D4
-:101DD0002806002058060020340600205406002063
-:101DE0002C06002038060020300600208A0800203B
-:101DF0008808002089080020870800204C06002061
-:101E00008B080020400600202406002038B5114C25
-:101E10002368002B0CD020684288531C8218157A46
-:101E20000288934212D3FFF7E9FD002323600EE0FE
-:101E3000094B1B78002B02D10120404208E0022010
-:101E4000FFF7DAF920600028E5D1F5E74380281C88
-:101E500038BDC046680600201F06002010B50D4C96
-:101E60002368002B03D02368002B0ED103E00A4B1C
-:101E70001B78002B02D10120404209E00220FFF72D
-:101E8000BBF920600028EED1F5E75A889B18187A34
-:101E900010BDC046680600201F060020054B58886C
-:101EA000054B1B68002B03D01A885B88D31AC01817
-:101EB0007047C0467C0800206806002010B50A4B19
-:101EC0001B78002B0FD0094C2068002803D0FFF7A7
-:101ED00095FD002323600220FFF78EF9002802D031
-:101EE000FFF78CFDF7E710BD1F06002068060020F5
-:101EF000F7B5304D0123071C0C1C2B70002C56D05D
-:101F00002D4E3068002827D12C4A01922C4B1B788B
-:101F1000DBB2002B03D12B700120404249E00320AB
-:101F2000FFF784F9072808D801232B70FFF748FD35
-:101F3000214B186000280FD128700198214B0138DF
-:101F40000190002802D01A78002A02D001221A70CB
-:101F5000E2E700F0C3FAD9E71A4B002231681A70A1
-:101F60004B884020C01A0094844200D90090181C6D
-:101F7000009A08309B1808184B800190A41A00237F
-:101F80000098834204D0F85C019AD0540133F7E7FB
-:101F9000FF184B883F2B06D940230B800320FFF707
-:101FA00091F900233360084B05221A70A6E72C70C4
-:101FB000201CFEBD5D0600206006002009750000A3
-:101FC0001F060020640600205C06002007B56B4653
-:101FD000D8710733181C0121FFF78AFF0EBDFFFFE0
-:101FE000F8B5124B1B78002B1ED0114F114B3C68DB
-:101FF00001261E70104D002C09D000262E7063881B
-:1020000003202380211CFFF75DF93E6009E0FFF704
-:10201000D7FC011E04D003202C70FFF753F900E019
-:102020002E70044A00231370F8BDC0461F0600201E
-:10203000600600205D0600205C06002038B50E4BCF
-:102040001D78EDB2002D15D10C4C2168002906D069
-:102050004B8803200B80FFF735F925600AE0FFF776
-:10206000AFFC011E03D00320FFF72CF902E0044B64
-:1020700001221A7038BDC0465D06002060060020AF
-:102080005C06002010B5041C01F0FCFD201C10BDF6
-:10209000214B70B518681E1C2049214A002809D020
-:1020A000127809680A71421E511D01D10322524261
-:1020B0001A6030E00B6812781A4D1A702B68002BEA
-:1020C00023D0194B00211C68201C01F065FE00285C
-:1020D00016D1201C154901F069FE002810D11449C1
-:1020E000201C02F091F8FC21890502F0B7F901F0FB
-:1020F0008FFE021E272A03D90E480F4901F0AAFDC0
-:102100002B68336000232B6005E00A4801F0BAFD1C
-:102110000A4BFF221A7070BD900600208406002032
-:102120008C0600208806002094060020ABAA2A4DC9
-:102130000000C0417006002091200000FC02002039
-:10214000F8B5051C0C1C1A2874D8002A08D0101CDD
-:102150004843FA21890001F0B3FD4600013601E051
-:1021600003267642201C02F00FFB011C324801F0CE
-:1021700067FE0C236B43314A041CD3185F6872B6A8
-:102180002F4B19788D4215D12E4D296801F0F4FDA1
-:102190002D4B002806D0186801220240013A9619FA
-:1021A0001E6046E0294A1968166001220A402C6028
-:1021B0001A603EE0264B1A2903D826491868097888
-:1021C00001701F490D700C214D4351595519081CC0
-:1021D000083018601F4A287A1070087272B61B689F
-:1021E0001278197B0A431A7362B6A2235B003B6024
-:1021F000154B201C1E60134B00211C6001F0CCFD10
-:10220000002816D1201C144901F0D0FD002810D15F
-:102210001249201C01F0F8FFFC21890502F01EF98B
-:1022200001F0F6FD021E272A03D90D480D4901F0E1
-:1022300011FD62B6F8BDC0460024F4488451000088
-:10224000FC02002094060020900600208806002052
-:10225000840600208C060020ABAA2A4D0000C04155
-:10226000700600209120000010B51A280FD872B611
-:10227000074C2378834209D1064801F003FD064B41
-:10228000064A1B6812781A70FF23237062B610BDCD
-:10229000FC02002070060020840600208C0600202E
-:1022A00008B505480023037004498023044A43739A
-:1022B00002F0BAFA08BDC046700600208520000072
-:1022C0007002002010B5041C006802F0EBFA201C1C
-:1022D00010BD38B5041C0D1C0068013102F0B2FBC2
-:1022E000002801D021C4012038BD436810B5041C6A
-:1022F0008B4208D2FFF7EDFF002805D0A368002B22
-:1023000001D122681370012010BDF8B5041C0F1C08
-:10231000151E05D10368002B00D01A7000230DE0B4
-:10232000111CFFF7E2FF061C2068002E08D10028D0
-:1023300002D002F0B7FA266000236360A36003E0D6
-:10234000A560391C02F0BEFB201CF8BD38B5002387
-:10235000041C0D1C0360436083600373994207D023
-:10236000081C02F0B7FB291C021C201CFFF7CDFF44
-:10237000201C38BD38B5051C00680C1C00280CD08A
-:102380006A688B689A4206D3096802F09BFBA268D0
-:102390000023AA600AE002F085FA236862682B60D5
-:1023A000A3686A60AB60002323606360A36038BDEC
-:1023B00010B5041E8C4201D0FFF7DCFF201C10BDBD
-:1023C00007B5002201AB19705A70191C0122FFF7E2
-:1023D0009CFF0EBD10B50023041C036043608360A6
-:1023E0000373FFF7EDFF201C10BDF7B50368171C42
-:1023F0000022041C0D1C86680092994206D39A198B
-:10240000914203D2CB1A019301230093002F1AD0DB
-:10241000BE19201C311CFFF768FF002813D0009B59
-:10242000A0682168002B09D0019A081889183A1C65
-:1024300002F042FA22680023935503E00818291C91
-:1024400002F040FBA660201CFEBD08B50B1C9A687C
-:102450000968FFF7CAFF08BD13B5002201AB041CD1
-:1024600019705A70191C0122FFF7BFFF201C16BDFE
-:1024700008B5FEF701F9FEF7FDFA00F02FF8FAE7CC
-:1024800008B5FFF70BFD08BD08B5FFF7BFFC08BD99
-:1024900008B5FFF7E3FC08BD08B5FFF7A1FD08BDCF
-:1024A00008B5FFF70BFD08BD08B5081CFFF78EFD4A
-:1024B00008BD08B5081C111CFFF71AFD08BD7047C0
-:1024C000044B00221A711A73FA21034A8900996099
-:1024D0001A60704798060020D052000010B5104CCA
-:1024E0002378002B1BD101232370FFF7D7FC002892
-:1024F00001D0FFF7E4FF00F0E5FA002801D001F079
-:10250000AFF900F02FFD002801D001F049FA00F0EA
-:10251000F5FF002801D001F0E3FA0023237010BD7D
-:10252000A8060020024B1A6801321A607047C046A4
-:102530002805002010B50B4C23685A0301D5FEF77F
-:10254000FFFE23685A0501D500F02EFB23681A050B
-:1025500001D500F079FD2368DA04ECD501F040F8EC
-:10256000E9E7C0463480044008B5FFF7E3FFFFFF0A
-:10257000014B00221A607047008104407047FFFF42
-:10258000024A136818181060181C704700030020D6
-:10259000EFF31380002821D1EFF31082002A1FD11E
-:1025A000EFF30583002B0FD0101C0F2B0ED91A1C34
-:1025B000103A92080B4903209200034052188340BE
-:1025C0001068D840C0B201E080204000EFF31182D3
-:1025D000002A05D0824203D2101C01E001204042B3
-:1025E0007047C04600E400E0F8B5061C0D1C171C3F
-:1025F0000024301C391C01F0A7FB092901D8303117
-:1026000000E03731C9B22955301C391C01F058FBA4
-:10261000061E01D00134ECE72B1958702B1C5A1BF5
-:10262000A24206DA1A78295D19702A550133013C55
-:10263000F5E7281CF8BDFFFF264B80221968D20061
-:102640000A431A60244A00231370244A1370244A50
-:102650001370244A1370244A1370244B1B78032BE5
-:1026600009D0152B04D0002B08D1214A214B04E0BE
-:102670001F4A214B01E0214A214B1A60214B1B7854
-:10268000042B0BD0052B05D0012B0BD1D1229200AE
-:102690001D4B06E0D12292001C4B02E091221C4B04
-:1026A00092001A601B4BC204D20E1A70C0B20022F4
-:1026B00058709A702C22DA70174BFF2219689143D8
-:1026C0000A1C40210A431A60144B802252011A60EE
-:1026D0007047C0463480044035070020B106002012
-:1026E0003C07002036070020B0060020F20600203C
-:1026F0001303000040A0044018C00440130200006F
-:10270000049004400403002044A004401CC0044082
-:102710000890044000A006400CE400E000E100E066
-:1027200010B5174B132299789143032202400A43B4
-:10273000410701D510210A439A700F221049024027
-:10274000042A03D18A79402422438A715A791021BC
-:102750008A43084200D00A435A7199791022914362
-:10276000840600D51143064A9971C10506D55378F0
-:1027700011782020DBB201431170537010BDC046A8
-:1027800000A0064008B5124B1B685A051ED5114B18
-:102790001B78DBB2002B02D0FFF7A0FEF7E70E4A52
-:1027A0008021490111600D4A0D49D3700422FF3286
-:1027B0000A600C490A600C4A13700C4A13700C4BE7
-:1027C0001B68002B02D00B4A12781A7108BDC04654
-:1027D00034800440B006002080E100E000A0064004
-:1027E00040A0044044A0044035070020B10600206A
-:1027F000AC060020F306002038B5041C0B4B1D78F6
-:10280000EDB2002DFAD1201C0121FEF7EFFB291CAF
-:10281000201CFEF7B9FB0C225443054B054AE15836
-:102820001C191160044B227A1A7038BDB0060020C2
-:1028300084510000380700203407002030B50029FB
-:1028400001D080231843224A1378141C98423ED0AA
-:10285000204A1268550539D57F221340042B0FD02A
-:1028600004D8012B0FD100221B4B0BE0052B04D009
-:10287000182B08D10022194B04E00022184B01E06C
-:10288000184B00221A604423002900D060237F22C5
-:102890000240042A15D006D8012A17D1C02292007E
-:1028A00013430D4A11E0052A06D0182A0ED18022C2
-:1028B000D2001343094A08E0C02292001343084A99
-:1028C00003E0802292001343064A1360207030BD5B
-:1028D000040300203480044044A0044050D004404D
-:1028E0001CC004400890044010B51A4A137898425E
-:1028F0002ED0194909684C0529D5032B0FD004D8CF
-:10290000002B0FD115490B600CE0152B04D0192BAF
-:1029100008D10021124B04E00021124B01E0124BC0
-:102920000021196003280FD004D800280FD10F49C7
-:102930000A4B0BE0152804D0192808D10C49084B84
-:1029400004E00A49074B01E00A49074B196010707F
-:1029500010BDC046F20600203480044040A0044070
-:1029600054D0044018C004400490044013030000F5
-:10297000130400001302000038B50E4B1A68002340
-:10298000510514D50C4C1A2810D80C2343430B4A7C
-:102990000B4D9958D3181B7A216001212B70FEF73B
-:1029A00025FB23682A781A72012300E02360181C93
-:1029B00038BDC04634800440AC060020845100007D
-:1029C000F306002000207047F8B5214B071C1B6858
-:1029D0005A053BD51F4B1B68002B02D01E4A1278AC
-:1029E0001A711E4E002334783F220134A2425B410B
-:1029F0005B421C401A4D2B78A3421CD1FFF7C8FD47
-:102A0000402813DC174A13795BB2002BF2DA2B78DB
-:102A1000002101333F209842494149420B4012496D
-:102A2000C95CDBB2C9B2D1712B70E3E7FF28E1DDED
-:102A3000FFF754FDDEE70C4BFFB21F550B4B012295
-:102A40001A70084BE4B2AC223470DA70F8BDC0469C
-:102A50003480044038070020340700203C07002061
-:102A60003607002000A00640B2060020B006002075
-:102A700038B5041C4518AC4204D02078FFF7A4FFF9
-:102A80000134F8E738BDFFFF08B5044B1B78002B75
-:102A900002D0FFF723FDF8E708BDC046B0060020CE
-:102AA000064B074A1B781078DBB2C0B2834201D3D1
-:102AB0003F3000E00138C01A7047C0463C07002094
-:102AC00036070020054B1878054BC0B21B78DBB2E7
-:102AD000984200D24030C01A7047C04635070020E7
-:102AE000B106002010B5124B12491A780B78D2B2F9
-:102AF000DBB29A4219D001333F2400209C4240416E
-:102B0000404203400C48DCB2C05C0C700B49C0B2C0
-:102B1000096800290BD09A4200D24032D31A1A2BEE
-:102B200005DC074B1B780B7201E00120404210BD11
-:102B300035070020B1060020F4060020AC06002076
-:102B4000F30600200A4B1A780A4B1B78DBB29A4234
-:102B50000AD0013300223F21994252415242134090
-:102B6000054AD05CC0B201E0012040427047C04637
-:102B700035070020B1060020F4060020064B1A7825
-:102B8000064BD2B21A70064B1B68002B02D0054AC6
-:102B900012781A727047C046B1060020350700202F
-:102BA000AC060020F306002030B5254A13799906BB
-:102BB00012D52449D4790B78002001333F259D425A
-:102BC0004041404203402048E4B20078834203D0B1
-:102BD0001E48C454DBB20B70D178194CC9B24BB249
-:102BE000002B1ADA23795BB2002B16DA184B19483E
-:102BF0001D780378DBB29D4202D16C23E3700CE0B8
-:102C0000013300243F259D42644164422340124C1D
-:102C1000E45CDBB2E4B2D4710370402319420ED0FD
-:102C2000117919420BD00D4B002119700C4B1B6808
-:102C30008B4202D00B49097819722C23D37030BD16
-:102C400000A0064035070020B1060020F406002051
-:102C50003C07002036070020B2060020B006002006
-:102C60003807002034070020164B80221968120113
-:102C70000A431A60144A00231370144A144913704B
-:102C8000144A1370144A1370144A1370144A1160D2
-:102C9000144AD12189001160134AC104C90EC0B27F
-:102CA0001170507093702C23D370104B104A196818
-:102CB0000A408021C9010A431A600E4B802292010A
-:102CC0001A60704734800440B00700204507002098
-:102CD00013030000B8070020B107002044070020BC
-:102CE0000CB0044010B0044000B006400CE400E01A
-:102CF000FF00FFFF00E100E010B5174B13229978A9
-:102D00009143032202400A43410701D510210A439F
-:102D10009A700F2210490240042A03D18A79402474
-:102D200022438A715A7910218A43084200D00A430B
-:102D30005A71997910229143840600D51143064AAD
-:102D40009971C10506D5537811782020DBB2014373
-:102D50001170537010BDC04600B0064008B5124B4C
-:102D60001B681A051ED5114B1B78DBB2002B02D055
-:102D7000FFF7B4FBF7E70E4A8021890111600D4A85
-:102D80000D49D3700422FF320A600C490A600C4AD4
-:102D900013700C4A13700C4B1B68002B02D00B4AAB
-:102DA00012781A7108BDC0463480044044070020E0
-:102DB00080E100E000B006400CB0044010B00440D8
-:102DC000B007002045070020400700206E070020C4
-:102DD00038B5041C0B4B1D78EDB2002DFAD1201C28
-:102DE0000121FEF703F9291C201CFEF7CDF80C2267
-:102DF0005443054B054AE1581C191160044B227AD3
-:102E00001A7038BD4407002084510000B407002028
-:102E1000AF0700207047704738B50E4B1A68002383
-:102E2000110514D50C4C1A2810D80C2343430B4A17
-:102E30000B4D9958D3181B7A216001212B70FEF796
-:102E4000D5F823682A781A72012300E02360181C41
-:102E500038BDC04634800440400700208451000043
-:102E60006E07002000207047F8B5214B071C1B6837
-:102E70001A053BD51F4B1B68002B02D01E4A127847
-:102E80001A711E4E0023347827220134A2425B417E
-:102E90005B421C401A4D2B78A3421CD1FFF778FBF4
-:102EA000402813DC174A13795BB2002BF2DA2B7837
-:102EB0000021013327209842494149420B401249E1
-:102EC000C95CDBB2C9B2D1712B70E3E7FF28E1DD49
-:102ED000FFF704FBDEE70C4BFFB21F550B4B012243
-:102EE0001A70084BE4B2AC223470DA70F8BDC046F8
-:102EF00034800440B4070020AF070020B80700204A
-:102F0000B107002000B0064046070020440700201B
-:102F100038B5041C4518AC4204D02078FFF7A4FF54
-:102F20000134F8E738BDFFFF08B5044B1B78002BD0
-:102F300002D0FFF7D3FAF8E708BDC04644070020E7
-:102F4000064B074A1B781078DBB2C0B2834201D32C
-:102F5000273000E00138C01A7047C046B80700208B
-:102F6000B1070020054B1878054BC0B21B78DBB2C7
-:102F7000984200D24030C01A7047C046B0070020C7
-:102F80004507002010B5124B12491A780B78D2B2BF
-:102F9000DBB29A4219D001333F2400209C424041C9
-:102FA000404203400C48DCB2C05C0C700B49C0B21C
-:102FB000096800290BD09A4200D24032D31A1A2B4A
-:102FC00005DC074B1B780B7201E00120404210BD6D
-:102FD000B0070020450700206F07002040070020B1
-:102FE0006E0700200A4B1A780A4B1B78DBB29A4214
-:102FF0000AD0013300223F219942524152421340EC
-:10300000054AD05CC0B201E0012040427047C04692
-:10301000B0070020450700206F070020064B1A78F4
-:10302000064BD2B21A70064B1B68002B02D0054A21
-:1030300012781A727047C04645070020B00700207A
-:10304000400700206E07002030B5254A1379990605
-:1030500012D52449D4790B78002001333F259D42B5
-:103060004041404203402048E4B20078834203D00C
-:103070001E48C454DBB20B70D178194CC9B24BB2A4
-:10308000002B1ADA23795BB2002B16DA184B194899
-:103090001D780378DBB29D4202D16C23E3700CE013
-:1030A0000133002427259D42644164422340124C91
-:1030B000E45CDBB2E4B2D4710370402319420ED059
-:1030C000117919420BD00D4B002119700C4B1B6864
-:1030D0008B4202D00B49097819722C23D37030BD72
-:1030E00000B00640B0070020450700206F07002011
-:1030F000B8070020B1070020460700204407002041
-:10310000B4070020AF070020204B8022196852012D
-:103110000A431A601E4A002313701E4A13701E4A87
-:1031200013701E4A13701E4A13701E4B1B78062B19
-:1031300004D0072B05D11C4A1C4B01E01A4A1C4B3A
-:103140001A601C4B1B78082B05D0142B07D1D122F9
-:103150009200194B02E0D122184B92001A60184BD2
-:10316000C204D20E1A70C0B2002258709A702C227B
-:10317000DA70144B144A19680A408021C9030A43C3
-:103180001A60124B8022D2011A60704734800440CA
-:103190002C080020C1070020340800202D08002042
-:1031A000C0070020050300201303000008C00440EE
-:1031B00010C004400603002014C004400CC00440AA
-:1031C00000C006400CE400E0FFFF00FF00E100E06B
-:1031D00010B5174B132299789143032202400A43FA
-:1031E000410701D510210A439A700F22104902406D
-:1031F000042A03D18A79402422438A715A79102102
-:103200008A43084200D00A435A71997910229143A7
-:10321000840600D51143064A9971C10506D5537835
-:1032200011782020DBB201431170537010BDC046ED
-:1032300000C0064008B5124B1B68DA041ED5114BBE
-:103240001B78DBB2002B02D0FFF748F9F7E70E4AF4
-:103250008021C90111600D4A0D49D3700422FF324B
-:103260000A600C490A600C4A13700C4A13700C4B2C
-:103270001B68002B02D00B4A12781A7108BDC04699
-:1032800034800440C007002080E100E000C0064018
-:1032900008C004400CC004402C080020C1070020D6
-:1032A000BC070020EA07002038B5041C0B4B1D7832
-:1032B000EDB2002DFAD1201C0121FDF797FE291C4B
-:1032C000201CFDF761FE0C225443054B054AE158D2
-:1032D0001C191160044B227A1A7038BDC0070020F7
-:1032E00084510000300800202B08002030B5002950
-:1032F00001D080231843154A1378141C984224D017
-:10330000134A1268D5041FD57F221340082B04D01E
-:10331000142B05D100220F4B01E00F4B00221A6045
-:103320004423002900D060237F220240082A06D0CF
-:10333000142A09D1C02292001343064A03E0C02296
-:1033400092001343044A1360207030BD060300202E
-:103350003480044014C004400CC0044010B50F4A2F
-:103360001378984218D00E490968CC0413D5062B5F
-:1033700004D0072B05D100210A4B01E00A4B0021A4
-:103380001960062804D0072805D10849054B01E03B
-:103390000649054B1960107010BDC046050300209A
-:1033A0003480044008C0044010C0044013030000EF
-:1033B00038B50E4B1A680023D10414D50C4C1A28CA
-:1033C00010D80C2343430B4A0B4D9958D3181B7A42
-:1033D000216001212B70FDF709FE23682A781A72FB
-:1033E000012300E02360181C38BDC046348004402F
-:1033F000BC07002084510000EA070020002070472D
-:10340000F8B5214B071C1B68DA043BD51F4B1B6822
-:10341000002B02D01E4A12781A711E4E00233478F7
-:1034200027220134A2425B415B421C401A4D2B789B
-:10343000A3421CD1FFF7ACF8402813DC174A1379DC
-:103440005BB2002BF2DA2B7800210133272098425F
-:10345000494149420B401249C95CDBB2C9B2D17142
-:103460002B70E3E7FF28E1DDFFF738F8DEE70C4BD0
-:10347000FFB21F550B4B01221A70084BE4B2AC226D
-:103480003470DA70F8BDC046348004403008002043
-:103490002B080020340800202D08002000C0064022
-:1034A000C2070020C007002038B5041C4518AC42F4
-:1034B00004D02078FFF7A4FF0134F8E738BDFFFF00
-:1034C00008B5044B1B78002B02D0FFF707F8F8E78C
-:1034D00008BDC046C0070020064B074A1B7810787D
-:1034E000DBB2C0B2834201D3273000E00138C01AFA
-:1034F0007047C046340800202D080020054B18787E
-:10350000054BC0B21B78DBB2984200D24030C01AE3
-:103510007047C0462C080020C107002010B5124B90
-:1035200012491A780B78D2B2DBB29A4219D0013321
-:103530003F2400209C424041404203400C48DCB202
-:10354000C05C0C700B49C0B2096800290BD09A42CC
-:1035500000D24032D31A1A2B05DC074B1B780B72B2
-:1035600001E00120404210BD2C080020C1070020CE
-:10357000EB070020BC070020EA0700200A4B1A785E
-:103580000A4B1B78DBB29A420AD0013300223F215A
-:103590009942524152421340054AD05CC0B201E008
-:1035A000012040427047C0462C080020C10700207F
-:1035B000EB070020064B1A78064BD2B21A70064B66
-:1035C0001B68002B02D0054A12781A727047C04659
-:1035D000C10700202C080020BC070020EA070020BB
-:1035E00030B52E4A1379990624D52D49D4790B7814
-:1035F000002001333F259D4240414042034029487D
-:10360000E4B20078834203D02748C454D8B208708B
-:103610002649086800280DD025490978C9B28B428F
-:1036200001D35B1A01E05B1A4033272B02DD214BEB
-:103630001B780371D178194CC9B24BB2002B1ADA3E
-:1036400023795BB2002B16DA1B4B19481D780378DF
-:10365000DBB29D4202D16C23E3700CE00133002405
-:1036600027259D42644164422340144CE45CDBB254
-:10367000E4B2D4710370402319420ED0117919427B
-:103680000BD00F4B002119700E4B1B688B4202D0E0
-:103690000D49097819722C23D37030BD00C0064043
-:1036A0002C080020C1070020EB070020BC070020E9
-:1036B0002D080020EA07002034080020C20700205F
-:1036C000C0070020300800202B0800201FB572B66C
-:1036D000154B70221A70154A41211170144A0F219E
-:1036E000117080221A701A7852B2002AFBDA114B3C
-:1036F000186862B6104B984201D80A23584301ACAF
-:10370000211C0A22FEF770FF0023E15C0B4A00290E
-:1037100005D058001018013341800A2BF5D1013330
-:103720005B0013701FBDC04600000240070002404E
-:1037300006000240080002407F969800E403002043
-:1037400008B50368C9B21B68984708BD08B5036887
-:10375000C9B21B68984708BD08B50368C9B21B68A1
-:10376000984708BD08B50368C9B21B68984708BDEB
-:1037700008B5044B4808C01800F0A2FAFEF75CFF39
-:1037800008BDC046C0C62D0010B5064B4808C0187D
-:10379000141C00F095FAFEF74FFF201CFEF7C0FF47
-:1037A00010BDC046C0C62D0008B5FEF7EBFF08BD32
-:1037B00008B5081CFFF720F808BD08B5081CFFF77E
-:1037C00093F808BD08B5081C111CFFF737F808BDB1
-:1037D00008B5081CFFF7D0F8431E9841C0B208BDD9
-:1037E00008B5081CFFF7EEF8431E9841C0B208BDAB
-:1037F00008B5FFF767F908BD08B5FFF7A3F908BDDD
-:1038000008B5FFF76FF908BD08B5FFF73DF908BD2A
-:1038100008B5FFF7B3F908BD08B5FFF741F908BDD2
-:1038200008B5081CFFF7D0F8012008BD08B5081C32
-:10383000FFF7CAF8012008BD10B5081C141C111CA4
-:10384000FFF716F9201C10BD38B5081C0D1C01F03F
-:1038500041F9041C211C281CFFF70AF9201C38BD63
-:103860007047FFFF044B00221A711A73FA21034AB2
-:10387000890099601A60704738080020585300008A
-:1038800008B50368C9B21B68984708BD08B5036846
-:10389000C9B21B68984708BD08B50368C9B21B6860
-:1038A000984708BD08B50368C9B21B68984708BDAA
-:1038B00008B5044B4808C01800F002FAFFF7D4F925
-:1038C00008BDC04660E3160010B5064B4808C01896
-:1038D000141C00F0F5F9FFF7C7F9201CFFF70CFAEC
-:1038E00010BDC04660E3160008B5FFF737FA08BD03
-:1038F00008B5081CFFF76CFA08BD08B5081CFFF7EF
-:103900008AFA08BD08B5081C111CFFF783FA08BD28
-:1039100008B5081CFFF780FA431E9841C0B208BDE5
-:1039200008B5081CFFF79EFA431E9841C0B208BDB7
-:1039300008B5FFF717FB08BD08B5FFF753FB08BD37
-:1039400008B5FFF71FFB08BD08B5FFF7EDFA08BD86
-:1039500008B5FFF763FB08BD08B5FFF7F1FA08BD2E
-:1039600008B5081CFFF780FA012008BD08B5081C3F
-:10397000FFF77AFA012008BD10B5081C141C111CB1
-:10398000FFF7C6FA201C10BD38B5081C0D1C01F04D
-:10399000A1F8041C211C281CFFF7BAFA201C38BD12
-:1039A0007047FFFF044B00221A711A73FA21034A71
-:1039B000890099601A60704748080020B8530000D9
-:1039C00008B50368C9B21B68984708BD08B5036805
-:1039D000C9B21B68984708BD08B50368C9B21B681F
-:1039E000984708BD08B50368C9B21B68984708BD69
-:1039F00008B5044B4808C01800F062F9FFF784FBD3
-:103A000008BDC04660E3160010B5064B4808C01854
-:103A1000141C00F055F9FFF777FB201CFFF7D8FBCB
-:103A200010BDC04660E3160008B5FFF703FC08BDF3
-:103A300008B5081CFFF738FC08BD08B5081CFFF7DF
-:103A40008DFC08BD08B5081C111CFFF74FFC08BD14
-:103A500008B5081CFFF7ACFC431E9841C0B208BD76
-:103A600008B5081CFFF7CAFC431E9841C0B208BD48
-:103A700008B5FFF743FD08BD08B5FFF77FFD08BD9A
-:103A800008B5FFF74BFD08BD08B5FFF719FD08BDE8
-:103A900008B5FFF78FFD08BD08B5FFF71DFD08BD90
-:103AA00008B5081CFFF7ACFC012008BD08B5081CD0
-:103AB000FFF7A6FC012008BD10B5081C141C111C42
-:103AC000FFF7F2FC201C10BD38B5081C0D1C01F0DE
-:103AD00001F8041C211C281CFFF7E6FC201C38BD43
-:103AE0007047FFFF044B00221A711A73FA21034A30
-:103AF000890099601A607047580800201854000027
-:103B000008B50B4B1A68002A04D001221A60094B31
-:103B10001B689847084B1B78002B08D0074B1A6886
-:103B2000002A04D001221A60024B5B68984708BD46
-:103B30000C7103406C0800206A0800201C710340CF
-:103B4000064B8022196812040A431A60044B0022B3
-:103B50001A60044B01221A707047C0463C80044032
-:103B6000007003406A080020054B01221A60054BD3
-:103B7000054A19680A401A60044B00221A707047FF
-:103B8000007003403C800440FFFF7FFF6A08002074
-:103B900070B544780E4D0F4E23015A199B190E4DE6
-:103BA0000669A40042606651002483601C601160B5
-:103BB00003221A60094B417B094A18680904024034
-:103BC0000A431A60074B8022D2031A6070BDC046B8
-:103BD00000710340087103406C08002014E400E009
-:103BE000FFFF00FF00E100E0F8B50C4B061C1B785E
-:103BF0000F1C002B01D1FFF7A3FF094D2C78002CDF
-:103C000004D06B780020834207D10124301C7470EB
-:103C1000391CFFF7BDFF01202855F8BD6A080020B8
-:103C20006808002008B5836800221A608021074BCD
-:103C3000C90319604178064B5A541A78002A04D1F6
-:103C40005B78002B01D1FFF78FFF08BD80E100E01A
-:103C50006808002070B50378041C0E1C151C002B8E
-:103C600003D0FFF7DFFF002323702661201C291CEF
-:103C7000FFF7BAFF002802D00123237000E0207074
-:103C8000207870BD037810B5041C002B01D0FFF71D
-:103C9000C9FF0023237010BD02B4714649084900D2
-:103CA000095C49008E4402BC7047C04603B47146AB
-:103CB000490840004900095A49008E4403BC704736
-:103CC000002934D00123002210B488422CD30124CF
-:103CD0002407A14204D2814202D209011B01F8E764
-:103CE000E400A14204D2814202D249005B00F8E71D
-:103CF000884201D3401A1A434C08A04202D3001B49
-:103D00005C0822438C08A04202D3001B9C0822437B
-:103D1000CC08A04202D3001BDC082243002803D0B9
-:103D20001B0901D00909E3E7101C10BC70470028EB
-:103D300001D00020C04307B4024802A140180290FD
-:103D400003BDC046190000000029F0D003B5FFF7FD
-:103D5000B9FF0EBC4243891A1847C0467047C04697
-:103D60008446081C6146FFE71FB500F001FA0028F1
-:103D700001D40021C8421FBD10B500F087F94042B0
-:103D8000013010BD10B500F0F3F9002801DB002070
-:103D900010BD012010BDC04610B500F0E9F90028A3
-:103DA00001DD002010BD012010BDC04610B500F09F
-:103DB00097F9002801DC002010BD012010BDC0468D
-:103DC00010B500F08DF9002801DA002010BD0120A7
-:103DD00010BDC0461C2101231B04984201D3000CD6
-:103DE00010391B0A984201D3000A08391B0998426E
-:103DF00001D30009043902A2105C40187047C04684
-:103E000004030202010101010000000000000000A3
-:103E10009E2110B5C905041CFFF7D2FF002803D16D
-:103E2000201C00F091FC10BD9E21C905201C00F053
-:103E300015FB00F089FC80231B06C018F3E7C04681
-:103E4000F0B55F4656464D464446F0B4460245003E
-:103E5000C00F85B00F1C760A2D0E804641D0FF2D75
-:103E600026D08024240400212643F6007F3D894685
-:103E70008B46F90F7C027800640A000E00918A4696
-:103E80003CD0FF2834D080231B041C430023E400D3
-:103E90007F380193009F4346019A7B4049469C46E8
-:103EA00011430F2900D971E0764F89007F58BF4632
-:103EB000002E3ED10822022391469B46D9E75A465E
-:103EC000341CC24601920199022937D0032900D13E
-:103ED000CFE0012900D0ABE053460B400022002682
-:103EE00032E0002E19D10421012289469346C0E711
-:103EF000221C531E9A4102320192CBE701270197FF
-:103F0000002CC7D0201CFFF765FF431F9C40762381
-:103F10005B420021181A0191BCE7301CFFF75AFFE1
-:103F20007625431F9E406D4200232D1A99469B46DD
-:103F30009FE70C23032199468B469AE7D446012339
-:103F400067463B40FF2200267602D205700ADB0757
-:103F50001043184305B03CBC90469946A246AB4678
-:103F6000F0BD80260023F603FF22EDE700220026A5
-:103F7000EAE78020C00306423BD0044239D1061C48
-:103F800026437602760A009BFF22DDE7281A03907B
-:103F900076016401A64239D3361B1A22012301207F
-:103FA000311C5B007600002901DBB44201D8361BCE
-:103FB0000343013A002AF3DC741EA641341C1C435F
-:103FC000039A7F32002A27DD630704D00F232340A2
-:103FD000042B00D00434270103D52B4B039A1C403B
-:103FE0008032FE2A0BDD012361460B40FF220026B2
-:103FF000AAE706437602760A4346FF22A4E7A40115
-:1040000001236746660AD2B23B409DE7039F1B220D
-:10401000013F03970023C2E77E23039F5B42DB1B24
-:104020001B2B07DD012361460B40002200268BE796
-:10403000D446C5E7221CDA40039B9E339C40231CD8
-:104040005C1EA34113435A0704D00F221A40042ACE
-:1040500000D004335F0105D5012361460B400122E6
-:10406000002671E79E01624601231340760A002272
-:104070006AE78026F60326437602760A5346FF2235
-:1040800062E7C04670540000FFFFFFF74A02430298
-:1040900070B55C0A550A43004A001B0EC60F120E8B
-:1040A000C90FFF2B05D0FF2A08D0012093420BD067
-:1040B00070BD0120002CFBD1FF2AF6D10120002D7C
-:1040C000F6D101209342F3D1AC42F1D18E4205D01A
-:1040D000002BEDD1201C441EA041E9E70020E7E7BA
-:1040E0004A024302F0B55C0A550A43004A001B0E1F
-:1040F000C60F120EC90FFF2B31D0FF2A34D0002B70
-:1041000016D1604260418446002A14D0002820D194
-:104110008E4217D1934215DC04DBAC4212D800204A
-:10412000AC4212D2704270414042012318430CE06D
-:10413000002AEDD194466F426F416046002805D1B8
-:10414000002FE5D0704201231843F0BD0020002F5E
-:10415000FBD148424841404201231843F5E7002C77
-:10416000CBD002204042F0E7002DC8D0F9E7C0468E
-:104170004A024302F0B55C0A550A43004A001B0E8E
-:10418000C60F120EC90FFF2B27D0FF2A29D0002BF4
-:1041900010D0002A15D194466F426F416046002826
-:1041A00015D00020002F04D148424841404201234D
-:1041B0001843F0BD604260418446002AECD00028DC
-:1041C000F2D18E4211D0704201231843F1E7002F43
-:1041D000F7D0704201231843EBE70220002CE8D10E
-:1041E000D3E70220002DE4D1D1E79342EBDC04DBDE
-:1041F000AC42E8D80020AC42DBD270427041404271
-:1042000001231843D5E7C046F0B55F4656464D46F4
-:104210004446F0B44402460083B00F1C640A360ED4
-:10422000C50F002E41D0FF2E22D080231B0400207A
-:104230001C43E4007F3E82468046391C4B007F02CF
-:10424000C90F7F0A1B0E8B463BD0FF2B34D0802238
-:1042500012041743FF007F3B00215A466A40019237
-:1042600052460A430F2A63D87A48920082589746EA
-:10427000002C3FD10822022392469846DDE70195A3
-:10428000404602282AD1019A01251540FF23002427
-:104290006402DB05600AED071843284303B03CBC09
-:1042A00090469946A246AB46F0BD002C27D104208B
-:1042B000012282469046C0E7391C4A1E91410231D4
-:1042C000CBE70121002FC8D0381CFFF783FD431F27
-:1042D0009F4076235B421B1A0021BEE7032800D1D2
-:1042E000AEE001284FD1019842461040C5B20023EC
-:1042F0000024CDE70C2303209A4680469DE7201C2E
-:10430000FFF768FD7626431F9C4076420023361A4D
-:104310009A46984691E780240025E403FF23B7E7F7
-:104320005B463C1C01938846AAE73C1C8846A7E7ED
-:10433000250C24043A0C240C3F04F6183F0C211CD5
-:10434000231C794353436F435543FB180A0C9B18B6
-:10435000B1469F4202D980225202AD1809041A04C4
-:10436000090C521894011B0C611E8C41920EED1821
-:104370001443AD012C43230105D50122630801201C
-:10438000144081441C434B467F33002B2DDD6007D6
-:1043900004D00F222240042A00D00434220103D585
-:1043A0002D4B1C404B468033FE2B17DD019B012516
-:1043B0001D400024FF236BE78020C003044208D087
-:1043C000074206D1041C3C436402640A5D46FF2395
-:1043D0005EE704436402640AFF2359E70198A401DD
-:1043E0000125640ADBB2054052E77E235B424A4660
-:1043F0009B1A1B2B05DD019B01251D40002400237A
-:1044000046E7221CDA404B469E339C40231C5C1E30
-:10441000A3411343580704D00F221A40042A00D0A6
-:1044200004335A0105D5019B01251D4000240123B9
-:104430002EE701989C010125640A0540002327E727
-:104440008027FF03019B3C43640201251D40640A51
-:10445000FF231DE7B0540000FFFFFFF7F8B5C20FC0
-:10446000430244004D024800240E161C9B09000E16
-:10447000C90FAD09FF2800D183E0012779408A42A6
-:104480005CD0221A002A00DC8EE000281ED1002D0C
-:1044900000D07AE0580704D00F221A40042A00D036
-:1044A00004338021C90401221940324000293AD046
-:1044B0000134FF2C00D183E09B015B0A5B02E4B274
-:1044C000E405580AD20720431043F8BDFF2CE1D081
-:1044D0008021C9040D431B2A00DD31E1291C202065
-:1044E000D140821A95406A1E95410D435B1B5801CD
-:1044F000D0D59B019F09381CFFF76CFC421F9740E9
-:1045000094425FDC141B1F231B1B3A1C9F40611C41
-:104510003B1CCA405F1EBB4113430024BAE7131E75
-:10452000B8D100230022DB08FF2C04D1002B47D098
-:104530008020C00303435B025B0ABFE7211A002906
-:1045400044DD002827D0FF2CA4D08020C0040543E0
-:104550001B2900DDF2E0281C2027C840791A8D4075
-:10456000691E8D4105435B19590100D492E701345E
-:10457000FF2C59D0734901221A400B405B081343AA
-:1045800088E7002D00D07AE777E7013A002AADD01E
-:10459000FF2CA0D17EE7002D00D17BE70139002957
-:1045A000E1D0FF2CD4D175E7002A1BD1621CD2B216
-:1045B000012A4BDD5F1B7A0123D5EF1A0E1C9AE707
-:1045C00000237BE75F4BA41A3B4063E7002946D1F9
-:1045D000611CC8B2012829DDFF2924D0EB185B0833
-:1045E0000C1C57E7002C13D0FF2818D08024E404BB
-:1045F000524223431B2A4DDD0123EB1A041C0E1CDF
-:1046000075E7002F00D076E70023002200248AE718
-:10461000002B3BD0D243002AEFD0FF28EAD12B1C3D
-:10462000FF240E1C36E7FF2400237CE7002C5CD11E
-:10463000002B00D180E0002D00D12BE75B19580141
-:1046400000D427E73F4A0124134023E7002C15D16B
-:10465000002B40D1002D63D02B1C0E1C1AE7002C20
-:1046600021D1002B54D0C943002904D0FF284CD0BD
-:104670001B2958DD01235B19041C75E7002B19D198
-:10468000002D48D02B1C0E1CFF2403E72B1C041C00
-:104690000E1CFFE61C1C2026D440B21A93405A1E62
-:1046A00093412343A9E7FF282FD08024E404494203
-:1046B0002343DDE7FF24002D00D1EBE68022DB0859
-:1046C000D203134204D0ED08154201D12B1C0E1C5D
-:1046D000DB00FF24DEE6002D00D1DBE65A1B500193
-:1046E00000D41CE7EB1A0E1CD4E6002B0DD0FF24DF
-:1046F000002D00D1CEE68022DB08D2031342E7D0A2
-:10470000ED081542E4D12B1CE2E72B1CFF24C1E687
-:104710002B1C041CBEE6802300229B04FF2402E71E
-:10472000231C0022FFE61C1C2027CC40791A8B405A
-:10473000591E8B4123439EE72B1CABE6012512E754
-:104740000125D3E6FFFFFFFB4302590A4300C20FD6
-:104750001B0E00207E2B0DDD9D2B0CDC8020000429
-:104760000143952B0ADC9620C31AD9404842002AFF
-:1047700000D1081C7047034BD018FBE7963B9940CB
-:10478000F4E7C046FFFFFF7F10B5041E33D0FFF7EC
-:1047900021FB9E231B1A962B09DC083884406402F7
-:1047A000640ADBB26402DB05600A184310BD992B72
-:1047B0000ADD0522121A211CD1400A1C011C1B31E2
-:1047C0008C40611E8C411443052801DD421F94403A
-:1047D000144A2240610704D00F210C40042C00D061
-:1047E000043251010AD59F23181AFF2816D09401CC
-:1047F000640AC3B2D6E700230024D3E7D208FF2B14
-:1048000003D05402640ADBB2CCE7002A06D080242D
-:10481000E40314436402640AFF23C3E7FF23002474
-:10482000C0E7C046FFFFFFFB08B5031C081C191CAE
-:1048300000F002F808BDFFFF38B5051C05480C1C48
-:10484000131C002804D00220291C221C00E000BFF9
-:1048500038BDC0460000000070B50E4B0E4D002460
-:10486000ED1AAD101E1CAC4204D0A300F3589847BB
-:104870000134F8E700F058FE084B094D0024ED1A0A
-:10488000AD101E1CAC4204D0A300F358984701346D
-:10489000F8E770BD34550000345500003455000071
-:1048A0005055000008B5034B011C186800F02EF8A5
-:1048B00008BDC0465C04002010B50023934203D01D
-:1048C000CC5CC4540133F9E710BD70B5814201D30B
-:1048D00000230CE08C18A042FAD28518131C013B6F
-:1048E0000BD351426618F65C6918CE54F7E7934231
-:1048F00003D0CC5CC4540133F9E770BD031C8218AB
-:10490000934202D019700133FAE7704730B500299D
-:1049100040D004390B68002B00DAC9181E4A13680E
-:10492000141C002B02D14B60116033E099420FD26E
-:1049300008680A189A4205D113685268C0180860BE
-:104940004A6000E04B60216024E08A4203D8131CD7
-:104950005A68002AF9D11D685C198C420BD109688C
-:10496000691858181960904214D1146852680919CE
-:1049700019605A600EE08C4202D90C23036009E0F2
-:1049800008680C18944203D1146852680019086032
-:104990004A60596030BDC0467808002070B50323D6
-:1049A000CD1C9D430835061C0C2D01D20C2501E0C1
-:1049B000002D3FDB8D423DD3204B1C681A1C211C6F
-:1049C000002913D00868431B0DD40B2B02D90B60B0
-:1049D000CC181EE08C4202D1636813601AE048686C
-:1049E00060600C1C16E00C1C4968E9E7144C206858
-:1049F000002803D1301C00F031F82060301C291C45
-:104A000000F02CF8431C15D0C41C03239C438442A3
-:104A10000AD12560201C0B300722231D9043C31AA6
-:104A20000BD05A42E25008E0211A301C00F016F870
-:104A30000130EED10C233360002070BD78080020D7
-:104A40007408002008B50A1C0349031C0868191CD7
-:104A500000F02DFB08BDC0465C04002038B5074CB3
-:104A60000023051C081C2360FDF78AFD431C03D1AD
-:104A70002368002B00D02B6038BDC046D40800202E
-:104A80000EB400B59CB01DAB04CB822202A99200EB
-:104A90008A810A4A02908A604A6101225242CA818E
-:104AA000074A086110681D9A019300F07BF8029A8A
-:104AB000002313701CB008BC03B01847FFFFFF7F32
-:104AC0005C040020031C0A7801311A700133002AAB
-:104AD000F9D170470023C25C0133002AFBD1581E74
-:104AE0007047FFFFF0B58D6885B0071C0C1C039262
-:104AF0000193AB4245D390228B89D20013423DD023
-:104B000062690326564309692068F20F401A961914
-:104B10000290021C0198013212187610964200D2BF
-:104B2000161C381C5A050FD5311CFFF737FF051E20
-:104B300013D0029A2169FFF7BFFEA289184B1340D8
-:104B400080221343A38111E0321C00F0B0FA051E4D
-:104B50000CD1381C2169FFF7D9FE0C233B60A389D7
-:104B6000402213430120A381404217E0029B2561AC
-:104B7000ED1825606661019DF61AA6600198A842AD
-:104B800000D2019D2A1C20680399FFF79EFEA268AF
-:104B90000020531BA36023685D19256005B0F0BD9C
-:104BA0007FFBFFFFF0B59FB0039005938B890E1C30
-:104BB000171C19060FD53269002A0CD14021FFF7C6
-:104BC000EDFE30603061002803D103990C230B60A7
-:104BD000C9E04023736106AD00236B6120236B762F
-:104BE0003023AB763C1C2378002B03D1E21B0292CE
-:104BF00011D003E0252BF9D00134F4E70398311CE0
-:104C00003A1C029BFFF76EFF013000D1A6E06969F4
-:104C1000029A8B186B612378002B00D19EE0012251
-:104C200052426A606A4600235B3201342B60EB60BB
-:104C3000AB601370AB654E4F2178381C052200F035
-:104C40002BFA002807D0C71B2B680120B840184357
-:104C500028600134EFE72B68D90603D56A46202186
-:104C60005B3211701A0703D56A462B215B32117033
-:104C700022782A2A01D0099B0EE0059A111D12689C
-:104C80000591002A01DB099204E05242EA60022207
-:104C900013432B60013409E02278303A092A04D802
-:104CA0000A214B4301349B18F6E7099323782E2BF6
-:104CB00018D163782A2B09D1059B02341A1D1B6871
-:104CC0000592002B0DDA01235B420AE00134002338
-:104CD0002278303A092A04D80A214B4301349B1820
-:104CE000F6E70793234F2178381C032200F0D4F90C
-:104CF000002806D0C71B2B684020B8401843286006
-:104D0000013421781C480622671C297600F0C4F97A
-:104D1000002812D0194B002B06D1059B0722073320
-:104D200093430833059314E005AB00930398291CC3
-:104D3000321C134B00E000BF07E005AB0093039863
-:104D4000291C321C0E4B00F091F80490049901319B
-:104D500004D06A69049953186B6143E7B3895A0612
-:104D600001D40B9801E0012040421FB0F0BDC046C5
-:104D7000F2540000F8540000FC5400000000000051
-:104D8000E54A0000F7B5151C01930A698B68061CFB
-:104D90000C1C934200DA131C221C2B604332127845
-:104DA000002A01D001332B602068800602D52B68D1
-:104DB00002332B60216806270F401FD0231C43338A
-:104DC0001B785A1E9341226892061FD5E118403184
-:104DD0003020C870211C5A1C45310978A218403275
-:104DE0000233D17012E0221C301C019919320123C8
-:104DF000089FB847013011D0009F01370097E06845
-:104E00002968009F431A9F42EDDBD7E7221C301C24
-:104E100001994332089FB847013002D10120404236
-:104E200023E0206806212B68E26801400025042960
-:104E300003D1D51AEB43DB171D40A26823699A42C0
-:104E400001DDD31AED1800270097009FAF420BDA5F
-:104E5000221C301C01991A320123089FB8470130E7
-:104E6000DCD0009F0137EFE70020FEBDF0B50D1C40
-:104E70008BB0433506920590079304950B7E0C1C6E
-:104E8000109A6E2B00D1A7E011D8632B22D009D83D
-:104E9000002B00D1B0E0582B00D0C0E045310B70A2
-:104EA0007B4D4EE0642B1CD0692B1AD0B7E0732BDE
-:104EB00000D1A5E009D86F2B29D0702B00D0AEE02F
-:104EC0000E68202333430B6036E0752B1FD0782B00
-:104ED00032D0A4E013680D1C191D423511601B6807
-:104EE0009FE0216813680E0603D5191D11601E6826
-:104EF00005E04806F9D5191D116000215E5E644B7E
-:104F0000002E3BDA049D2D2276422A7036E021687D
-:104F100013680E0603D5191D11601E6804E04806CB
-:104F2000F9D5191D1E881160594B227E039308275D
-:104F30006F2A1ED00A271CE0231C78214533554DCB
-:104F4000197011682368081D039510601E0601D5AD
-:104F50000E6802E05806FBD50E88D90702D520223C
-:104F6000134323601027002E03D1226820239A4385
-:104F70002260231C002243331A7001E003930A27A6
-:104F80006368A360002B03DB25680422954325603A
-:104F9000002E02D1049D002B0ED0049D301C391C24
-:104FA000FEF7D2FE0398013D435C301C2B70391C88
-:104FB000FEF786FE061EF1D1082F09D12168C90728
-:104FC00006D5626823699A4202DC013D30232B70CA
-:104FD000049E731B23612AE008681368496905066B
-:104FE00004D5181D10601B68196005E04606F8D549
-:104FF000181D10601B68198000232361049D16E0B2
-:105000001368191D11601D68281CFFF763FD636894
-:105010002061984200D923612069606004E0251C6A
-:1050200042352B7001232361049E00233370079EB9
-:1050300005980096211C09AA069BFFF7A3FE0130E4
-:1050400002D10120404221E02A1C059806992369DB
-:10505000079DA8470130F4D02668B60705D4099B00
-:10506000E068984212DA181C10E00025E0680999FF
-:10507000431A9D42F3DA221C05980699193201233E
-:10508000079EB0470130DCD00135EFE70BB0F0BD33
-:105090000355000014550000C9B28218904204D094
-:1050A00003788B4202D00130F8E700207047F8B552
-:1050B000061C0C1C151C002904D1111CFFF76EFCEA
-:1050C000041C18E0002A03D1FFF720FC2C1C12E07E
-:1050D00000F013F8A8420ED2301C291CFFF75EFC2A
-:1050E000071E07D0211C2A1CFFF7E6FB301C211CE1
-:1050F000FFF70CFC3C1C201CF8BD04390B68181F82
-:10510000002B02DAC8581B18181F7047256C640062
-:10511000256C75004720256320256C6420256420BC
-:10512000256400656E6400742000350020473A0055
-:105130002050445F73637265656E3A002050445F8F
-:105140006C617365723A00556E6B6E6F776E20639B
-:105150006F6D6D616E643A2000050E08090D0C0636
-:10516000070F0B004417FF050E08090D0C06070F6B
-:105170000B004417FFFFFFFFFFFFFFFFFFFFFF1ABA
-:105180001BFFFFFF420000F840A0044001000000A8
-:10519000420000F844A0044002000000C00000F8F3
-:1051A00000C0044001000000000000F8049004402A
-:1051B00002000000000000F8089004400400000015
-:1051C000C00000F81CC0044080000000C00000F8CF
-:1051D00010C0044010000000C00000F808C00440E7
-:1051E00004000000C00000F80CC0044008000000EB
-:1051F000800000F80CB0044008000000800000F8B7
-:1052000010B0044010000000800000F818B0044006
-:1052100040000000800000F81CB004408000000046
-:10522000800000F814B0044020000000C00000F826
-:1052300004C0044002000000800000F800B00440F8
-:1052400001000000400000F800A004400100000040
-:10525000400000F804A0044002000000400000F8F4
-:105260000CA0044008000000400000F808A0044022
-:1052700004000000C00000F814C00440200000003A
-:10528000C00000F818C0044040000000800000F892
-:1052900004B0044002000000800000F808B00440A0
-:1052A00004000000020100F850D00440100000008B
-:1052B000020100F854D0044020000000030100F86F
-:1052C00078D0044040000000000000000000000012
-:1052D000A9240000B32400008124000089240000D8
-:1052E0009124000099240000A12400000000000087
-:1052F0001519151519FFFFFF000100000703002015
-:10530000120000000002000032030020950000009F
-:1053100000030000E0030020000000000103090476
-:105320001A0300200000000002030904C803002043
-:105330000000000003030904E40300200000000053
-:10534000000000000000000000000000FFFFFFFF61
-:105350000000000000000000213800003938000083
-:10536000F137000001380000F9370000093800006B
-:105370007137000089370000A9370000B1370000FD
-:10538000BB370000C5370000D1370000E13700000F
-:105390001138000019380000413700004D37000077
-:1053A0005937000065370000493800002D380000EB
-:1053B00000000000000000006139000079390000A1
-:1053C0003139000041390000393900004939000005
-:1053D000B1380000C9380000E9380000F138000099
-:1053E000FB380000053900001139000021390000A8
-:1053F0005139000059390000813800008D38000013
-:1054000099380000A5380000893900006D39000086
-:105410000000000000000000A13A0000B93A0000BE
-:10542000713A0000813A0000793A0000893A0000A0
-:10543000F1390000093A0000293A0000313A000031
-:105440003B3A0000453A0000513A0000613A000042
-:10545000913A0000993A0000C1390000CD390000AE
-:10546000D9390000E5390000C93A0000AD3A000022
-:105470008C3F00003E3F00006C3F0000C63E000035
-:105480006C3F0000623F00006C3F0000C63E000021
-:105490003E3F00003E3F0000623F0000C63E00006D
-:1054A000BE3E0000BE3E0000BE3E0000723F000057
-:1054B000304300002A4300002A430000204300003C
-:1054C000804200008042000016430000204300009C
-:1054D000804200001643000080420000204300008C
-:1054E0007E4200007E4200007E420000B843000081
-:1054F0004300232D302B2000686C4C006566674507
-:10550000464700303132333435363738394142433B
-:1055100044454600303132333435363738396162EC
-:105520006364656600FFFFFFF8B5C046F8BC08BCC1
-:105530009E46704739040000310C0000A122000093
-:10554000C124000065380000A5390000E53A0000DC
-:10555000000000009C04002014050020AC04002082
-:105560007C040020FC0400200A040000410E00001E
-:10557000410E0000410E0000410E0000410E0000EF
-:10558000410E0000410E0000410E0000410E0000DF
-:10559000410E0000410E0000410E0000410E0000CF
-:1055A000410E0000410E0000410E0000410E0000BF
-:1055B000410E0000410E0000410E0000410E0000AF
-:1055C000410E0000410E0000410E0000410E00009F
-:1055D000410E0000410E0000FFFFFFFFFF00000032
-:1055E000D80800200107081201010100000040C096
-:1055F000168904000201020301001803540065002B
-:1056000065006E00730079006400750069006E002B
-:105610006F0009029500030100C032080B0002026E
-:105620000201040904000001020201000524001027
-:1056300001052401010104240206052406000107D6
-:1056400005810310004009040100020A0000000760
-:105650000502024000000705830240000009040221
-:10566000000201030000072401000141000624029A
-:1056700001010006240202020009240301030102C1
-:10568000010009240302040101010009050502408B
-:105690000000000005250101010905840240000009
-:1056A0000000052501010300180354006500650092
-:1056B0006E007300790020004D004900440049004D
-:1056C000040309040C0300000000000000000000B7
-:1056D00000000000000000000000000000000000CA
-:1056E00000000000000000000000000000000000BA
-:1056F000000000000000000000000000F054000066
-:105700000000000000000000000000000000000099
-:105710000000000000000000000000000000000089
-:105720000000000000000000000000000000000079
-:10573000000000000000000000000000FC0300204A
+:10068000F9FC0C20012100F0F5FC0D20012100F007
+:10069000F1FC1420002100F0EDFC0F20002100F0FF
+:1006A000E9FC1020002100F0E5FC0E20022100F002
+:1006B000E1FC0E200C49042200F06CFC0B4B0022E4
+:1006C0001A700124FFF7ACFF094B211C0D201C7090
+:1006D00000F09EFC211C0B2000F09AFC0C20211C39
+:1006E00000F096FC10BDC046810400000C050020FF
+:1006F000E804002030B50B2085B0012100F088FC13
+:10070000FA24A400142000F097FB051C1248FFF700
+:10071000AFFEFFF7DDFE2020FFF7CAFE28B2FFF78D
+:10072000D7FEFFF72FFFE1235B01013BFDD1013C29
+:10073000002CE7D1211C0B2000F06AFC0749684619
+:1007400001F048FE6846FFF7BBFE684601F0FEFD7B
+:10075000FFF718FF05B030BD10050020AB510000B9
+:1007600030B50B2085B0012100F052FCFA242401A1
+:10077000102000F061FB051C1248FFF779FEFFF71F
+:10078000A7FE2020FFF794FE281CFFF7A1FEFFF72D
+:10079000F9FEE1235B01013BFDD1013C002CE7D1D7
+:1007A000211C0B2000F034FC0749684601F012FEC2
+:1007B0006846FFF785FE684601F0C8FDFFF7E2FED8
+:1007C00005B030BD10050020AB5100007FB5041E00
+:1007D0005A2C16D172B600F091FCB64B1860FFF798
+:1007E00011FFB54B01221A7062B60025B34B291CCC
+:1007F0000B201D7000F00CFC0C20291C00F008FCE4
+:1008000018E054280FD1AE49684601F0E3FD684670
+:10081000FFF756FE684601F099FDA648FFF728FE4F
+:10082000FFF76CFE42E1502804D0442806D10A208C
+:1008300000F088FC201CFFF7DCFE39E1031C313B93
+:10084000082B0AD89B48FFF713FE2F3C9A4B012236
+:10085000A4005242E0505A602AE1522811D1964A2F
+:1008600000245368591C5160082902DCD91C8900F6
+:100870008C58981CFFF72CFE3A20FFF719FE201C1D
+:1008800004E1492819D18C4B012252425A600024BC
+:100890001D1C8C4B013BFDD18648FFF7E9FDA300F1
+:1008A000EB189860201C3130C0B20134FFF700FE15
+:1008B000FFF768FE092CECD1FAE0462802D1FFF7D9
+:1008C000AFFEB7E7562811D1FFF786FEFFF7F0FD20
+:1008D0002020FFF7EDFD7C49684601F07BFD68466E
+:1008E000FFF7EEFD684601F031FDDFE047280BD150
+:1008F000764C2068FFF7ECFDFFF744FE00232360F1
+:10090000A36001232373D3E0412801D1704B1DE084
+:10091000422812D16748FFF7ABFD6E490022051C43
+:10092000172001F051FC201CFFF756FEFFF7C0FD19
+:100930002020FFF7BDFD281CA8E0532803D1172075
+:1009400001F0D6FC76E74D2807D1634B00221A60F0
+:100950009A6001221A735A736CE74E2820D1554EC3
+:100960005E4A316868468B180093FFF781FD051CCD
+:10097000201CFFF731FEFFF79BFD2020FFF798FDBD
+:10098000281CFFF7BBFDFFF7FDFD301CFFF770FDD6
+:10099000A842FAD3524801F0BBF801F035F987E0DC
+:1009A00043280ED1142000F047FA4E4C0123191CA5
+:1009B000221C6E2800DC00236360517311734320F6
+:1009C00039E7632804D1474B00225A731A7331E781
+:1009D000452801D1434C11E04C2805D1424B01225E
+:1009E0005A7300229A6025E76C2804D13E4B0022FE
+:1009F0005A736C201FE74A2809D13B4CE3682068F2
+:100A00006168A268FFF7CCFD0023A36050E0552881
+:100A100004D1FFF7EEFDFFF76DFE49E04F2804D14A
+:100A2000FFF7E7FDFFF79CFE42E0512831D1FFF7C9
+:100A3000D3FDFFF73DFD2D49684601F0CBFC68462C
+:100A4000FFF73EFD684601F081FC0F2000F0F4F94D
+:100A5000FFF73EFD2649684601F0BCFC6846FFF7FB
+:100A60002FFD684601F072FC142000F0E5F9FFF755
+:100A70002FFD2049684601F0ADFC6846FFF720FDD8
+:100A8000684601F063FC0E2000F0D6F9FFF720FD68
+:100A90000CE01949684601F09DFC6846FFF710FD1F
+:100AA000684601F053FC201CFFF702FDFFF76AFDCA
+:100AB0007FBDC04610050020BC040020E8040020D3
+:100AC000AF510000102E0000B2510000FC040020C5
+:100AD000AC040020881300007C040020F0D8FFFF45
+:100AE00009903C63140500209C040020B4510000D0
+:100AF000B8510000C4510000CF510000F0B5624C65
+:100B000087B021780D2000F083FA604D2B7B002BFD
+:100B100013D00F2000F090F9E1239B0098420CDDE8
+:100B20005B48FFF7A5FCAB6801220133AB600023F3
+:100B30002B732378286053402370564D2B7B002B5A
+:100B400011D0162000F078F914280CDD5048FFF77A
+:100B50008FFCAB6801220133AB6000232B73237839
+:100B6000286053402370012001F068F8061C701EB5
+:100B70008641F6B20196002E07D0474D2B7B002B05
+:100B800003D0464B1F78002F6ED0454D2B7B002B9A
+:100B900019D0142000F050F96968002902D16E289C
+:100BA00002DC10E059280EDC3948FFF761FCAB6825
+:100BB00001220133AB6023786E6853402370734287
+:100BC000734128606B60002472B6364B0021E358F5
+:100BD0005A7B8A420BD09F688F4208DD324A1D1C27
+:100BE000101CC4CDC4C02D6805609960012162B697
+:100BF000002906D02C4B186859689A68DB68FFF703
+:100C0000CFFC0434142CDFD1019E002E22D0234BC4
+:100C10001B78042B18D1254B02A8197801394B42B7
+:100C20005941234BC9B21970002903D0F02101F0BA
+:100C300015FC01E001F0CEFB02A91E4801F0FCFB0F
+:100C400002A801F083FB05E0052B03D1174B1878B0
+:100C5000FFF7BCFD01F066F9002812D001F01AF987
+:100C6000C0B2FFF7B3FD0CE00948FFF701FCAB6829
+:100C700001220133AB602378286053402F73237027
+:100C800083E707B0F0BDC046E8040020FC04002064
+:100C900010050020AC0400207C0400208608002001
+:100CA00014050020740200208C0400208808002015
+:100CB0000C050020EC04002010B500F01FFA064BD4
+:100CC000064C18600021201C01F084FB201C044904
+:100CD000044A03F0EDFD10BD10050020EC040020D7
+:100CE0004D23000070020020F0B51E4B1A688023CF
+:100CF0001A40FAD172B61C4B1978002930D01B4922
+:100D00000C681B490F681B493C190E681A49A41945
+:100D10000D681A496419086819492418096819489E
+:100D20006418A4B2184964080C43A4B20460174CB8
+:100D3000174800682568174CAC462768164C604475
+:100D40002668164CC0192568154C8019246840196E
+:100D5000001980B240080143124889B201601A703C
+:100D600062B6F0BD24B003402505002038B0034032
+:100D70003CB0034040B0034044B0034048B003409F
+:100D80004CB003402CB003400080FFFF5CB0034038
+:100D900058B0034060B0034064B0034068B0034003
+:100DA0006CB0034030B003401B4B1C4A19781C4BFD
+:100DB000082901D1002102E00A2903D1382111605C
+:100DC000132206E00C2901D1342100E03C211160FE
+:100DD00012221A60134B1A78134B002A01D00022FA
+:100DE00000E001221A60114B1A78114B012A01D838
+:100DF00080220CE0042A01D8842208E0082A01D8C5
+:100E0000852204E0102A01D8862200E087221A6099
+:100E1000084B01221A7070478802002008B0034076
+:100E20000CB003402705002020B0034089020020B9
+:100E300024B0034025050020031C70B50020272B9B
+:100E400032D81A4AD45CFF2C2ED0194B1B7883421F
+:100E500001D0FFF749FF72B6164B1022610605D587
+:100E60001968914319603F231C4002E019680A4346
+:100E70001A60114B114D01221C602A7062B61E1CB3
+:100E800072B633681A0608D50D4B186800232B700C
+:100E900062B60C4B1B78184106E02B78002BDBD098
+:100EA00062B601F05FFBEBE770BDC046E1510000A8
+:100EB000250500200CB0034000B0034026050020AB
+:100EC00010B00340240500207047FFFF38B5074BE2
+:100ED0001C681C60064BDA681D1CA30700D59047F0
+:100EE0002B69620700D5984738BDC046A0900440E2
+:100EF0008C02002038B5244B244C1D681D60636AA9
+:100F00002A0700D59847A36AEA0600D59847E36AFE
+:100F10006A0600D59847236B2A0600D59847636B6D
+:100F2000AA0600D59847E36BEA0700D59847A36D5A
+:100F3000AA0700D59847E36D6A0700D59847144B78
+:100F40001D681D60A368EA0700D5984763692A06F3
+:100F500000D59847A369EA0600D59847E3696A0770
+:100F600000D59847236A2A0700D59847A36BAA079C
+:100F700000D59847236DAA0600D59847636D6A0689
+:100F800000D5984738BDC046A0B004408C02002070
+:100F9000A0C0044070B5041E1A2C2CD8042A2AD8EC
+:100FA000101C02F0BDFE0709050B03000B2306E031
+:100FB0000A2304E0082302E00C2300E009230C22AA
+:100FC00062430D480D4E82180D485268051CB83515
+:100FD0002E600C4DBC30056072B60B481568A4003D
+:100FE00028400A4D106061518021490408431B04C8
+:100FF0001843106062B670BD0C520000CD0E0000A8
+:1010000000F9FF1FF50E0000FFFFF0FF8C0200202B
+:1010100010B51A2818D80C2358430C4A83581018B6
+:101020001C7D027A224205D0002901D01A710BE002
+:101030001A7209E043681A68002902D003210A43A2
+:1010400001E002218A431A6010BDC0460C52000024
+:1010500000231A280AD80C235843054A815810182F
+:10106000027A0B7C13405A1E9341DBB2181C704766
+:101070000C520000F0B51A283DD80C273D1C454302
+:101080001D4A54196368161C012901D0042912D184
+:10109000784332583018147D007A20431075A2220C
+:1010A00052001A602022042901D1196814E019683D
+:1010B00091430A1C1EE0AA58247A107DA0431075A3
+:1010C000002902D08A1E012A12D8802252001A60FA
+:1010D000022903D11A6803210A430BE003290AD12C
+:1010E0001A6802210A431A601A6801218A4301E042
+:1010F0000422FF321A60F0BD0C52000072B60C4B95
+:101100000C491A680C4B1B68096862B6480104D583
+:1011100032219142894149425B18FA2080004343C1
+:101120000648821A06484243920D98187047C046F6
+:1011300018E000E004ED00E0280500207FBB00007F
+:101140005555010038B5041CFFF7D8FF051C002CCD
+:101150000FD0FFF7D3FF074B401B984206D9013C45
+:10116000002C06D0FA239B00ED18F2E701F0FAF903
+:10117000EFE738BDE70300001D4B8022D20510B514
+:101180001A60802212061A601A4B002018601A4951
+:101190001A4B1B4A1960282313601A4A1A4C136011
+:1011A0001A4A13601A4A13601A4A13601A4A1360E3
+:1011B00009222260194C2060194C2160194C2360CF
+:1011C000194C2360194C2260194C206019480160A9
+:1011D00019490B6019490B60194B1A60FFF7E4FDC0
+:1011E000C8204000FFF7AEFF00F0D8FB10BDC0469E
+:1011F00000E100E004800340FFBF000008800340DE
+:101200000C80034014800340008003401C80034096
+:10121000248003402C80034034800340049003402A
+:10122000089003400C90034014900340009003404A
+:1012300004A0034008A003400CA0034014A00340F6
+:1012400000A00340F0B50B4F02223B780A4E1A4330
+:10125000D2000A4DB418606028788824002800D095
+:10126000C82409040C43B450012250405340287054
+:101270003B70F0BDA005002000F8FF1F20060020F5
+:10128000431E10B5042B0FD872B6084A990088582F
+:10129000002807D044685B008C50054A01889C5A9E
+:1012A000611A995262B600E0002010BD8C05002042
+:1012B0007C080020431E0020042B09D872B6054A82
+:1012C0009B009B58002B02D001305B68FAE762B6A6
+:1012D0007047C046E405002038B572B60123164AAF
+:1012E0009A18013A127811071CD5144A5C01A558C6
+:1012F0009900002D05D1131908305860104BA350E8
+:101300000AE001242143C9008C58002C0AD153184B
+:10131000083058600B4B8B500B4B1A78013A1A70FF
+:1013200062B608E00133062BD9D162B6064B002223
+:101330001A7000F0A7FB38BD7853000000F8FF1FBB
+:1013400088004000C800400016060020421E10B56C
+:10135000042A30D8022380001843174BC0001B1802
+:1013600072B6164CA05C032809D802F0D9FC14020E
+:1013700016050833022011E0083304200EE010485F
+:10138000920014580F4B002C01D1115001E09858D5
+:10139000416099500EE0032000E00520A0540A1C93
+:1013A00008325A608822180700D5C8220988090423
+:1013B0000A431A6062B610BD00F8FF1F4405002002
+:1013C000E4050020F8050020F7B5B6490C780E1C9E
+:1013D000E4B262071FD5B44B1B78002B18D0B34A78
+:1013E0001378DBB2002B05D0013BDBB21370002B6E
+:1013F00000D100BEAE4A1378DBB2002B06D0013B11
+:10140000DBB21370002B01D100F05CFE00F0FCFB9E
+:10141000A44D04232B700825221C2A4000D154E23D
+:10142000A44BA54C1B78DBB21E099A08002E00D0F5
+:10143000DDE1D50065192F686A68B806000F01382C
+:101440000C2800D9D0E102F075FC93019301CF0183
+:10145000CF01CF01CF01CF01CF01AC01CF01CF012F
+:10146000CF010D0095491368954F52689548296042
+:10147000954D964900263B607A609BB201222E6012
+:101480002661A66102708B4218D8D021C9008B4218
+:1014900000D3E5E0812191408B4200D1C2E006D823
+:1014A000802B00D1A9E0822B00D1ABE0F5E0884A87
+:1014B000934200D1C5E0A022D20017E085498B42BB
+:1014C00000D152E10DD8882109018B4200D18EE074
+:1014D00090221201934200D0DFE0BA78724B1A706A
+:1014E00009E07D4A934200D1CFE07C4A0026934236
+:1014F00000D115E1D1E0A319196A090603D5586A8C
+:10150000083800F0BFFA0836A02EF4D100252E1CB2
+:10151000734AA858002805D04368019300F0B2FA36
+:101520000198F7E76E496F4B6F4A4851E850A85849
+:10153000002805D04368019300F0A4FA0198F7E76A
+:101540006A4B6B4AE8507300D0526749694B485167
+:10155000F05C0238032807D802F0E2FB0204020420
+:10156000002200E001229A5501360435052ECFD124
+:10157000614A002313700125161C604BEA18604B6A
+:101580009200EB18013B1B781370190720D500F06F
+:101590005BFA6B01002805D0E21808305060594A08
+:1015A000E25003E0E05033780133337000F04CFA3E
+:1015B0000122AB001343DB00002805D0E2180830FD
+:1015C00050603E4AE25003E0E0503378013333701C
+:1015D000AB0002221A43D2000021A1500322134380
+:1015E00093400135E150062DC7D10E1C98E02E4BDB
+:1015F000454C1B78161C237093E0434C2670667094
+:1016000002268EE0BB88052B47D83F4C3F4D9B0000
+:10161000267066705B191B780226334200D180E089
+:1016200022707EE0BA887F231340052B35DC7E884C
+:10163000002E32D135499B005B181A7802218A436B
+:1016400029E0BA887F231340052B26DC7E88002EF4
+:1016500023D12E4A9B009B181A7802210A431AE0D4
+:101660007A88B9882A4B5C68002C16D0188890427A
+:1016700009D15888884206D1120A032A01D1267856
+:101680004FE01E894DE00C33EDE7224B1A68224BE8
+:101690001A60BA78214B1A7042E01C4B0F221A7064
+:1016A00063E0C046802007401F060020A1050020FF
+:1016B0005C0600209020074000F8FF1FC800400093
+:1016C0000C060020200600202C05002081060000CA
+:1016D000020300002120000021220000212300003D
+:1016E0008C05002030050020E4050020F8050020CE
+:1016F0007C080020440500201606002030C8011098
+:10170000785300008800400017060020C0200740E2
+:101710008053000028050020D00800206C0600201F
+:10172000341CFB889E4200D91E1C371E402F00D956
+:101730004027201C391CFFF785FDE419F61B03D157
+:10174000351C402F04D010E04025B54200D9351C8F
+:10175000201C291CFFF776FD6419761B01D1402D52
+:1017600003D1754D754B2C601E800122744B3AE0FD
+:10177000744B1988744B994210D10023D05C734983
+:10178000C8540133072BF9D10B68862B02D1704B5B
+:101790000F221A700020011CFFF754FD6D4B2B60C7
+:1017A00022E0654F3D68002D13D064490E88341E39
+:1017B000402C00D94024281C211CFFF743FD361B78
+:1017C0005E4AB6B21680002E01D1402C00D12E19EF
+:1017D0003E605C4BA0221988D200914204D10022C5
+:1017E0005A709A785C4B1A700122554B61E0D20016
+:1017F000A4186068013E0838F6B22B4036D000F0DD
+:1018000041F95649B0004258554B002A1BD0556843
+:101810004550111C985D0831616003280BD802F017
+:101820007FFA02040608032104E0022102E00521F8
+:1018300000E0042199558823270700D5C823128882
+:10184000120413433CE0985D032808D802F068FABC
+:1018500039390204002200E001229A5531E02C407F
+:10186000624262410324A41A9C552AE062880280E5
+:10187000002A20D03B4D43804360B3005F593A4972
+:10188000002F01D1585101E0CD586860C850374B46
+:101890007600F15A5218F25200F0D6F8002804D01F
+:1018A0000830606021070AD507E0314B20601A78C4
+:1018B00001321A7005E02C4201D0264B00E02D4B7E
+:1018C00023602D4A082313707FE5012004421ED0B7
+:1018D0001B4902230B70294B264C1A70284B294DAB
+:1018E0001C609C60284C1A61DC609A615D60274B2B
+:1018F0000D241C70264CFF232370174C337022706C
+:10190000244A1370244B9F221A70087013E063B2AC
+:10191000002B04DA1D4B0D221A7080233370022332
+:101920001C4204D01A4A1178C9B2117033701023C6
+:101930001C4200D03370F7BD2C0500201406002097
+:10194000942007400C06002021200000C808002039
+:10195000A1050020C800400098200740E4050020B1
+:10196000440500208C050020300500207C08002064
+:10197000160600208800400080200740A0050020B7
+:1019800000F8FF1F4C050020A4050020C0200740E0
+:10199000882007408C2007408420074010B501F0C4
+:1019A000D9FE00221A4B0021D1509818083241600C
+:1019B000A82AF7D1174A80201468C002204310607B
+:1019C000180A154AC0B21070180C144AC0B2107030
+:1019D000134A1B0E1370134AFF231370124A134845
+:1019E0001370134A137001220270124801701249D9
+:1019F0000A70124A116899430B1C70210B43136043
+:101A00000F4B802252041A600E4B10221A7010BD28
+:101A100000F8FF1F348004409C200740B02007409E
+:101A2000B4200740802007408820074094200740CA
+:101A300010200740002107408420074018E400E000
+:101A400000E100E00821074038B572B60B4C25686C
+:101A5000281C02F003FA1D2802D962B600200CE00F
+:101A600080231B06C3409D43256062B6482358432C
+:101A7000034B181800230360436038BDF8020020B0
+:101A800000FAFF1F10B5041C0E484821201A02F06E
+:101A90005BF91D2815D80C4B1B78002B07D00B4B7E
+:101AA0001B78002B03D0201CFFF716FC09E072B650
+:101AB0008022074B1206C240101C1A68104318609F
+:101AC00062B610BD00FAFF1F160600201F06002098
+:101AD000F802002038B50B4C051C21783C2908D1B0
+:101AE000094B1B68002B04D00848002298470023AC
+:101AF000237023783B2B03D85A1C2270034AD554F9
+:101B000038BDC046870800204C0600208B08002006
+:101B1000F8B51F4D1F4C01232B702368061C002BAA
+:101B20001DD11D4F1D4B1B78002B2FD00420FFF71C
+:101B3000C1FB052804D9013F194B002F06D108E04D
+:101B4000FFF782FF20600028F5D008E01A78002A0D
+:101B500002D001221A7019E000F004FDE2E7104BF8
+:101B6000002221681A704A88531C92008A189660D5
+:101B70000F2B01D84B8007E040230B800420FFF798
+:101B8000E5FBFFF761FF206000232B70F8BDC04626
+:101B90003C06002044060020E14200001F06002011
+:101BA0004806002038B5041C0D1C032D0ED92078E2
+:101BB000637800021B04184304231843A378033DF1
+:101BC0001B061843FFF7A4FF0334EEE7032D09D1EA
+:101BD0002078637800021B04184307231843A37876
+:101BE0001B060DE0022D06D12078637800021B044D
+:101BF0001843062304E0012D05D1207805230002B7
+:101C00001843FFF785FF38BD10B50A4B1B78002B32
+:101C10000ED1094C216800290AD04B88002B07D02F
+:101C20009B000B800420FFF791FBFFF70DFF206066
+:101C300010BDC0463C06002044060020F8B5834C89
+:101C4000071C2368251C002B12D1814B1B78002B0D
+:101C500000D1E2E00520FFF713FB2060002800D14F
+:101C6000DBE00688002E03D1FFF70CFF2660D4E0EE
+:101C7000286843889A08920082189468028804337E
+:101C8000934201D2438005E0FFF7FCFE0520FFF7F9
+:101C9000F7FA28600F23251C1D40200A061C2A1C69
+:101CA0001E40083A0136062A00D980E0002F02D0F3
+:101CB000B74200D0B1E0220B1340082D0AD1082B07
+:101CC00000D0AAE0634B00221A70634B1B6893425A
+:101CD00032D163E0092D1AD1092B00D09DE0220EEC
+:101CE0005C4B210C002A09D0012018705B4B1B684B
+:101CF000002B53D0F0B2C9B2D2B206E01A70564BE4
+:101D00001B68002B4AD0F0B2C9B2984746E00A2DB2
+:101D100007D10A2B00D080E04E4B02221A70504BA4
+:101D200007E00B2D0DD10B2B77D14A4B03221A70F4
+:101D30004C4B1B68002B31D0210CF0B2C9B2220EE3
+:101D4000E3E70C2D06D10C2B67D1424B04221A700D
+:101D5000454B07E00D2D0DD10D2B5ED13D4B0522DE
+:101D60001A70424B1B68002B18D0210CF0B2C9B27C
+:101D7000984713E00E2D50D10E2B4ED1354B062235
+:101D80001A703B4B1B68002B08D0FE21620C8901A6
+:101D900011406202520EF0B211439847354B220CAB
+:101DA0001E70354B240E1A70344B1C704CE0042D01
+:101DB00008D1C0B2FFF78EFE200CC0B2FFF78AFE3A
+:101DC000200E28E06B1F022B1ED8C0B2FFF782FE48
+:101DD000052D08D0200CC0B2FFF77CFE072D02D1E4
+:101DE000200EFFF777FE264B234A19781170002248
+:101DF0001A70184B07221A70224B1B68002B23D035
+:101E00002148012298471FE00F2D12D11C4B1B784F
+:101E1000002B04D0C0B2FFF75DFE002015E00D4B93
+:101E200008221A70194B1B68002BB7D0C0B2984714
+:101E3000B4E7022DF1D1074B09221A70144B1B682D
+:101E4000002B01D0200C98470120F8BD500600203F
+:101E50001F060020860800202806002058060020C3
+:101E600034060020540600202C06002038060020EE
+:101E7000300600208A0800208808002089080020F9
+:101E8000870800204C0600208B0800204006002018
+:101E90002406002038B5114C2368002B0CD0206894
+:101EA0004288531C8218157A0288934212D3FFF796
+:101EB000E9FD002323600EE0094B1B78002B02D1C3
+:101EC0000120404208E00220FFF7DAF920600028F4
+:101ED000E5D1F5E74380281C38BDC04668060020E0
+:101EE0001F06002010B50D4C2368002B03D023687B
+:101EF000002B0ED103E00A4B1B78002B02D10120EE
+:101F0000404209E00220FFF7BBF920600028EED133
+:101F1000F5E75A889B18187A10BDC046680600205D
+:101F20001F060020054B5888054B1B68002B03D06B
+:101F30001A885B88D31AC0187047C0467C080020F6
+:101F40006806002010B50A4B1B78002B0FD0094CF7
+:101F50002068002803D0FFF795FD002323600220AE
+:101F6000FFF78EF9002802D0FFF78CFDF7E710BDD0
+:101F70001F06002068060020F7B5304D0123071C1E
+:101F80000C1C2B70002C56D02D4E3068002827D109
+:101F90002C4A01922C4B1B78DBB2002B03D12B7007
+:101FA0000120404249E00320FFF784F9072808D8C0
+:101FB00001232B70FFF748FD214B186000280FD13B
+:101FC00028700198214B01380190002802D01A781E
+:101FD000002A02D001221A70E2E700F0C3FAD9E722
+:101FE0001A4B002231681A704B884020C01A0094A6
+:101FF000844200D90090181C009A08309B180818D9
+:102000004B800190A41A00230098834204D0F85C0E
+:10201000019AD0540133F7E7FF184B883F2B06D9BC
+:1020200040230B800320FFF791F900233360084B16
+:1020300005221A70A6E72C70201CFEBD5D0600204C
+:1020400060060020097500001F06002064060020BD
+:102050005C06002007B56B46D8710733181C0121B8
+:10206000FFF78AFF0EBDFFFFF8B5124B1B78002B60
+:102070001ED0114F114B3C6801261E70104D002CD4
+:1020800009D000262E70638803202380211CFFF7CF
+:102090005DF93E6009E0FFF7D7FC011E04D0032084
+:1020A0002C70FFF753F900E02E70044A00231370E0
+:1020B000F8BDC0461F060020600600205D06002017
+:1020C0005C06002038B50E4B1D78EDB2002D15D101
+:1020D0000C4C2168002906D04B8803200B80FFF7A9
+:1020E00035F925600AE0FFF7AFFC011E03D003209D
+:1020F000FFF72CF902E0044B01221A7038BDC046EC
+:102100005D060020600600205C06002010B5041C5F
+:1021100001F0FCFD201C10BD214B70B518681E1C81
+:102120002049214A002809D0127809680A71421E04
+:10213000511D01D1032252421A6030E00B6812781F
+:102140001A4D1A702B68002B23D0194B00211C68E4
+:10215000201C01F065FE002816D1201C154901F055
+:1021600069FE002810D11449201C02F091F8FC21CE
+:10217000890502F0B7F901F08FFE021E272A03D964
+:102180000E480F4901F0AAFD2B68336000232B6035
+:1021900005E00A4801F0BAFD0A4BFF221A7070BD33
+:1021A00090060020840600208C060020880600206F
+:1021B00094060020ABAA2A4D0000C0417006002002
+:1021C00019210000FC020020F8B5051C0C1C1A287F
+:1021D00074D8002A08D0101C4843FA21890001F065
+:1021E000B3FD4600013601E003267642201C02F0D2
+:1021F0000FFB011C324801F067FE0C236B43314A90
+:10220000041CD3185F6872B62F4B19788D4215D114
+:102210002E4D296801F0F4FD2D4B002806D01868DA
+:1022200001220240013A96191E6046E0294A1968C7
+:10223000166001220A402C601A603EE0264B1A29E3
+:1022400003D826491868097801701F490D700C21C0
+:102250004D4351595519081C083018601F4A287AF7
+:102260001070087272B61B681278197B0A431A73D1
+:1022700062B6A2235B003B60154B201C1E60134B13
+:1022800000211C6001F0CCFD002816D1201C14494F
+:1022900001F0D0FD002810D11249201C01F0F8FFF8
+:1022A000FC21890502F01EF901F0F6FD021E272A25
+:1022B00003D90D480D4901F011FD62B6F8BDC046C5
+:1022C0000024F4480C520000FC0200209406002078
+:1022D0009006002088060020840600208C0600203E
+:1022E000ABAA2A4D0000C041700600201921000051
+:1022F00010B51A280FD872B6074C2378834209D13B
+:10230000064801F003FD064B064A1B6812781A7056
+:10231000FF23237062B610BDFC020020700600206F
+:10232000840600208C06002008B5054800230370B1
+:1023300004498023044A437302F0BAFA08BDC04638
+:10234000700600200D2100007002002010B5041C52
+:10235000006802F0EBFA201C10BD38B5041C0D1CFF
+:102360000068013102F0B2FB002801D021C4012035
+:1023700038BD436810B5041C8B4208D2FFF7EDFF4F
+:10238000002805D0A368002B01D12268137001201A
+:1023900010BDF8B5041C0F1C151E05D10368002BD9
+:1023A00000D01A7000230DE0111CFFF7E2FF061C9D
+:1023B0002068002E08D1002802D002F0B7FA26606B
+:1023C00000236360A36003E0A560391C02F0BEFB3C
+:1023D000201CF8BD38B50023041C0D1C03604360AD
+:1023E00083600373994207D0081C02F0B7FB291CD5
+:1023F000021C201CFFF7CDFF201C38BD38B5051C82
+:1024000000680C1C00280CD06A688B689A4206D3BE
+:10241000096802F09BFBA2680023AA600AE002F0B0
+:1024200085FA236862682B60A3686A60AB6000234A
+:1024300023606360A36038BD10B5041E8C4201D0D8
+:10244000FFF7DCFF201C10BD07B5002201AB19709F
+:102450005A70191C0122FFF79CFF0EBD10B5002316
+:10246000041C0360436083600373FFF7EDFF201CCF
+:1024700010BDF7B50368171C0022041C0D1C8668EC
+:102480000092994206D39A19914203D2CB1A019332
+:1024900001230093002F1AD0BE19201C311CFFF716
+:1024A00068FF002813D0009BA0682168002B09D08A
+:1024B000019A081889183A1C02F042FA226800238F
+:1024C000935503E00818291C02F040FBA660201C6D
+:1024D000FEBD08B50B1C9A680968FFF7CAFF08BD66
+:1024E00013B5002201AB041C19705A70191C01228B
+:1024F000FFF7BFFF201C16BD08B5FEF7BDF8FEF7BD
+:10250000FDFA00F02FF8FAE708B5FFF70BFD08BD5C
+:1025100008B5FFF7BFFC08BD08B5FFF7E3FC08BD31
+:1025200008B5FFF7A1FD08BD08B5FFF70BFD08BD15
+:1025300008B5081CFFF78EFD08BD08B5081C111C66
+:10254000FFF71AFD08BD7047044B00221A711A7379
+:10255000FA21034A890099601A60704798060020A2
+:102560005853000010B5104C2378002B1BD10123C9
+:102570002370FFF7D7FC002801D0FFF7E4FF00F03D
+:10258000E5FA002801D001F0AFF900F02FFD002896
+:1025900001D001F049FA00F0F5FF002801D001F068
+:1025A000E3FA0023237010BDA8060020024B1A682E
+:1025B00001321A607047C0462805002010B50B4C48
+:1025C00023685A0301D5FEF7FFFE23685A0501D59B
+:1025D00000F02EFB23681A0501D500F079FD236871
+:1025E000DA04ECD501F040F8E9E7C0463480044055
+:1025F00008B5FFF7E3FFFFFF014B00221A607047A9
+:10260000008104407047FFFF024A136818181060E9
+:10261000181C704700030020EFF31380002821D11D
+:10262000EFF31082002A1FD1EFF30583002B0FD0A8
+:10263000101C0F2B0ED91A1C103A92080B490320BC
+:1026400092000340521883401068D840C0B201E0A5
+:1026500080204000EFF31182002A05D0824203D28D
+:10266000101C01E0012040427047C04600E400E039
+:10267000F8B5061C0D1C171C0024301C391C01F079
+:10268000A7FB092901D8303100E03731C9B22955FB
+:10269000301C391C01F058FB061E01D00134ECE758
+:1026A0002B1958702B1C5A1BA24206DA1A78295D86
+:1026B00019702A550133013CF5E7281CF8BDFFFFCE
+:1026C000264B80221968D2000A431A60244A00234C
+:1026D0001370244A1370244A1370244A1370244A36
+:1026E0001370244B1B78032B09D0152B04D0002B1F
+:1026F00008D1214A214B04E01F4A214B01E0214A25
+:10270000214B1A60214B1B78042B0BD0052B05D0D5
+:10271000012B0BD1D12292001D4B06E0D122920059
+:102720001C4B02E091221C4B92001A601B4BC2040E
+:10273000D20E1A70C0B2002258709A702C22DA7031
+:10274000174BFF22196891430A1C40210A431A6063
+:10275000144B802252011A607047C04634800440F6
+:1027600035070020B10600203C0700203607002076
+:10277000B0060020F20600201303000040A0044031
+:1027800018C0044013020000049004400403002019
+:1027900044A004401CC004400890044000A006402F
+:1027A0000CE400E000E100E010B5174B132299782B
+:1027B0009143032202400A43410701D510210A43F5
+:1027C0009A700F2210490240042A03D18A794024CA
+:1027D00022438A715A7910218A43084200D00A4361
+:1027E0005A71997910229143840600D51143064A03
+:1027F0009971C10506D5537811782020DBB20143C9
+:102800001170537010BDC04600A0064008B5124BB1
+:102810001B685A051ED5114B1B78DBB2002B02D06A
+:10282000FFF7A0FEF7E70E4A8021490111600D4A2B
+:102830000D49D3700422FF320A600C490A600C4A29
+:1028400013700C4A13700C4B1B68002B02D00B4A00
+:1028500012781A7108BDC04634800440B0060020CA
+:1028600080E100E000A0064040A0044044A00440F5
+:1028700035070020B1060020AC060020F30600203A
+:1028800038B5041C0B4B1D78EDB2002DFAD1201C7D
+:102890000121FEF7EFFB291C201CFEF7B9FB0C22DF
+:1028A0005443054B054AE1581C191160044B227A28
+:1028B0001A7038BDB00600200C5200003807002006
+:1028C0003407002030B5002901D080231843224A64
+:1028D0001378141C98423ED0204A1268550539D509
+:1028E0007F221340042B0FD004D8012B0FD10022DC
+:1028F0001B4B0BE0052B04D0182B08D10022194BE1
+:1029000004E00022184B01E0184B00221A60442317
+:10291000002900D060237F220240042A15D006D867
+:10292000012A17D1C022920013430D4A11E0052A53
+:1029300006D0182A0ED18022D2001343094A08E09B
+:10294000C02292001343084A03E0802292001343FE
+:10295000064A1360207030BD040300203480044018
+:1029600044A0044050D004401CC0044008900440DF
+:1029700010B51A4A137898422ED0194909684C05A7
+:1029800029D5032B0FD004D8002B0FD115490B608C
+:102990000CE0152B04D0192B08D10021124B04E0B8
+:1029A0000021124B01E0124B0021196003280FD0C7
+:1029B00004D800280FD10F490A4B0BE0152804D08A
+:1029C000192808D10C49084B04E00A49074B01E0DB
+:1029D0000A49074B1960107010BDC046F20600206E
+:1029E0003480044040A0044054D0044018C0044047
+:1029F00004900440130300001304000013020000BD
+:102A000038B50E4B1A680023510514D50C4C1A2802
+:102A100010D80C2343430B4A0B4D9958D3181B7AFB
+:102A2000216001212B70FEF725FB23682A781A729A
+:102A3000012300E02360181C38BDC04634800440E8
+:102A4000AC0600200C520000F30600200020704766
+:102A5000F8B5214B071C1B685A053BD51F4B1B685B
+:102A6000002B02D01E4A12781A711E4E00233478B1
+:102A70003F220134A2425B415B421C401A4D2B783D
+:102A8000A3421CD1FFF7C8FD402813DC174A137975
+:102A90005BB2002BF2DA2B78002101333F20984201
+:102AA000494149420B401249C95CDBB2C9B2D171FC
+:102AB0002B70E3E7FF28E1DDFFF754FDDEE70C4B69
+:102AC000FFB21F550B4B01221A70084BE4B2AC2227
+:102AD0003470DA70F8BDC0463480044038070020F6
+:102AE000340700203C0700203607002000A00640E5
+:102AF000B2060020B006002038B5041C4518AC42D0
+:102B000004D02078FFF7A4FF0134F8E738BDFFFFB9
+:102B100008B5044B1B78002B02D0FFF723FDF8E724
+:102B200008BDC046B0060020064B074A1B78107847
+:102B3000DBB2C0B2834201D33F3000E00138C01A9B
+:102B40007047C0463C07002036070020054B187828
+:102B5000054BC0B21B78DBB2984200D24030C01A9D
+:102B60007047C04635070020B106002010B5124B53
+:102B700012491A780B78D2B2DBB29A4219D00133DB
+:102B80003F2400209C424041404203400C48DCB2BC
+:102B9000C05C0C700B49C0B2096800290BD09A4286
+:102BA00000D24032D31A1A2B05DC074B1B780B726C
+:102BB00001E00120404210BD35070020B106002091
+:102BC000F4060020AC060020F30600200A4B1A7819
+:102BD0000A4B1B78DBB29A420AD0013300223F2114
+:102BE0009942524152421340054AD05CC0B201E0C2
+:102BF000012040427047C04635070020B106002042
+:102C0000F4060020064B1A78064BD2B21A70064B17
+:102C10001B68002B02D0054A12781A727047C04612
+:102C2000B106002035070020AC060020F306002086
+:102C300030B5254A1379990612D52449D4790B78F1
+:102C4000002001333F259D4240414042034020483F
+:102C5000E4B20078834203D01E48C454DBB20B7048
+:102C6000D178194CC9B24BB2002B1ADA23795BB276
+:102C7000002B16DA184B19481D780378DBB29D42F9
+:102C800002D16C23E3700CE0013300243F259D4208
+:102C9000644164422340124CE45CDBB2E4B2D47180
+:102CA0000370402319420ED0117919420BD00D4BFD
+:102CB000002119700C4B1B688B4202D00B4909781C
+:102CC00019722C23D37030BD00A0064035070020B8
+:102CD000B1060020F40600203C0700203607002043
+:102CE000B2060020B006002038070020340700207C
+:102CF000164B8022196812010A431A60144A0023F5
+:102D00001370144A14491370144A1370144A137040
+:102D1000144A1370144A1160144AD12189001160B9
+:102D2000134AC104C90EC0B21170507093702C23A5
+:102D3000D370104B104A19680A408021C9010A4318
+:102D40001A600E4B802292011A6070473480044052
+:102D5000B00700204507002013030000B80700203B
+:102D6000B1070020440700200CB0044010B004401C
+:102D700000B006400CE400E0FF00FFFF00E100E0CF
+:102D800010B5174B132299789143032202400A434E
+:102D9000410701D510210A439A700F2210490240C1
+:102DA000042A03D18A79402422438A715A79102156
+:102DB0008A43084200D00A435A71997910229143FC
+:102DC000840600D51143064A9971C10506D553788A
+:102DD00011782020DBB201431170537010BDC04642
+:102DE00000B0064008B5124B1B681A051ED5114BE2
+:102DF0001B78DBB2002B02D0FFF7B4FBF7E70E4ADB
+:102E00008021890111600D4A0D49D3700422FF32DF
+:102E10000A600C490A600C4A13700C4A13700C4B80
+:102E20001B68002B02D00B4A12781A7108BDC046ED
+:102E3000348004404407002080E100E000B00640F8
+:102E40000CB0044010B00440B0070020450700203B
+:102E5000400700206E07002038B5041C0B4B1D787E
+:102E6000EDB2002DFAD1201C0121FEF703F9291C37
+:102E7000201CFEF7CDF80C225443054B054AE158BF
+:102E80001C191160044B227A1A7038BD44070020C7
+:102E90000C520000B4070020AF07002070477047B5
+:102EA00038B50E4B1A680023110514D50C4C1A289E
+:102EB00010D80C2343430B4A0B4D9958D3181B7A57
+:102EC000216001212B70FEF7D5F823682A781A7249
+:102ED000012300E02360181C38BDC0463480044044
+:102EE000400700200C5200006E07002000207047B1
+:102EF000F8B5214B071C1B681A053BD51F4B1B68F7
+:102F0000002B02D01E4A12781A711E4E002334780C
+:102F100027220134A2425B415B421C401A4D2B78B0
+:102F2000A3421CD1FFF778FB402813DC174A137922
+:102F30005BB2002BF2DA2B78002101332720984274
+:102F4000494149420B401249C95CDBB2C9B2D17157
+:102F50002B70E3E7FF28E1DDFFF704FBDEE70C4B16
+:102F6000FFB21F550B4B01221A70084BE4B2AC2282
+:102F70003470DA70F8BDC04634800440B4070020D5
+:102F8000AF070020B8070020B107002000B00640BE
+:102F9000460700204407002038B5041C4518AC4201
+:102FA00004D02078FFF7A4FF0134F8E738BDFFFF15
+:102FB00008B5044B1B78002B02D0FFF7D3FAF8E7D3
+:102FC00008BDC04644070020064B074A1B7810780E
+:102FD000DBB2C0B2834201D3273000E00138C01A0F
+:102FE0007047C046B8070020B1070020054B18788D
+:102FF000054BC0B21B78DBB2984200D24030C01AF9
+:103000007047C046B00700204507002010B5124B9E
+:1030100012491A780B78D2B2DBB29A4219D0013336
+:103020003F2400209C424041404203400C48DCB217
+:10303000C05C0C700B49C0B2096800290BD09A42E1
+:1030400000D24032D31A1A2B05DC074B1B780B72C7
+:1030500001E00120404210BDB007002045070020DC
+:103060006F070020400700206E0700200A4B1A78E7
+:103070000A4B1B78DBB29A420AD0013300223F216F
+:103080009942524152421340054AD05CC0B201E01D
+:10309000012040427047C046B0070020450700208D
+:1030A0006F070020064B1A78064BD2B21A70064BF7
+:1030B0001B68002B02D0054A12781A727047C0466E
+:1030C00045070020B0070020400700206E070020C1
+:1030D00030B5254A1379990612D52449D4790B784D
+:1030E000002001333F259D4240414042034020489B
+:1030F000E4B20078834203D01E48C454DBB20B70A4
+:10310000D178194CC9B24BB2002B1ADA23795BB2D1
+:10311000002B16DA184B19481D780378DBB29D4254
+:1031200002D16C23E3700CE00133002427259D427B
+:10313000644164422340124CE45CDBB2E4B2D471DB
+:103140000370402319420ED0117919420BD00D4B58
+:10315000002119700C4B1B688B4202D00B49097877
+:1031600019722C23D37030BD00B00640B007002088
+:10317000450700206F070020B8070020B107002096
+:103180004607002044070020B4070020AF070020B6
+:10319000204B8022196852010A431A601E4A0023FC
+:1031A00013701E4A13701E4A13701E4A13701E4A73
+:1031B00013701E4B1B78062B04D0072B05D11C4A1D
+:1031C0001C4B01E01A4A1C4B1A601C4B1B78082B45
+:1031D00005D0142B07D1D1229200194B02E0D12245
+:1031E000184B92001A60184BC204D20E1A70C0B26B
+:1031F000002258709A702C22DA70144B144A196805
+:103200000A408021C9030A431A60124B8022D2016E
+:103210001A607047348004402C080020C107002049
+:10322000340800202D080020C007002005030020DE
+:103230001303000008C0044010C00440060300202F
+:1032400014C004400CC0044000C006400CE400E080
+:10325000FFFF00FF00E100E010B5174B1322997843
+:103260009143032202400A43410701D510210A433A
+:103270009A700F2210490240042A03D18A7940240F
+:1032800022438A715A7910218A43084200D00A43A6
+:103290005A71997910229143840600D51143064A48
+:1032A0009971C10506D5537811782020DBB201430E
+:1032B0001170537010BDC04600C0064008B5124BD7
+:1032C0001B68DA041ED5114B1B78DBB2002B02D031
+:1032D000FFF748F9F7E70E4A8021C90111600D4A4E
+:1032E0000D49D3700422FF320A600C490A600C4A6F
+:1032F00013700C4A13700C4B1B68002B02D00B4A46
+:1033000012781A7108BDC04634800440C0070020FE
+:1033100080E100E000C0064008C004400CC004404A
+:103320002C080020C1070020BC070020EA0700206D
+:1033300038B5041C0B4B1D78EDB2002DFAD1201CC2
+:103340000121FDF797FE291C201CFDF761FE0C22D0
+:103350005443054B054AE1581C191160044B227A6D
+:103360001A7038BDC00700200C5200003008002041
+:103370002B08002030B5002901D080231843154ABE
+:103380001378141C984224D0134A1268D5041FD510
+:103390007F221340082B04D0142B05D100220F4BA1
+:1033A00001E00F4B00221A604423002900D0602363
+:1033B0007F220240082A06D0142A09D1C022920096
+:1033C0001343064A03E0C02292001343044A1360E9
+:1033D000207030BD060300203480044014C0044037
+:1033E0000CC0044010B50F4A1378984218D00E490B
+:1033F0000968CC0413D5062B04D0072B05D1002176
+:103400000A4B01E00A4B00211960062804D0072866
+:1034100005D10849054B01E00649054B19601070BC
+:1034200010BDC046050300203480044008C004409D
+:1034300010C004401303000038B50E4B1A68002377
+:10344000D10414D50C4C1A2810D80C2343430B4A32
+:103450000B4D9958D3181B7A216001212B70FDF771
+:1034600009FE23682A781A72012300E02360181CE1
+:1034700038BDC04634800440BC0700200C52000018
+:10348000EA07002000207047F8B5214B071C1B6895
+:10349000DA043BD51F4B1B68002B02D01E4A127862
+:1034A0001A711E4E0023347827220134A2425B4158
+:1034B0005B421C401A4D2B78A3421CD1FFF7ACF89D
+:1034C000402813DC174A13795BB2002BF2DA2B7811
+:1034D0000021013327209842494149420B401249BB
+:1034E000C95CDBB2C9B2D1712B70E3E7FF28E1DD23
+:1034F000FFF738F8DEE70C4BFFB21F550B4B0122EC
+:103500001A70084BE4B2AC223470DA70F8BDC046D1
+:1035100034800440300800202B08002034080020AC
+:103520002D08002000C00640C2070020C007002070
+:1035300038B5041C4518AC4204D02078FFF7A4FF2E
+:103540000134F8E738BDFFFF08B5044B1B78002BAA
+:1035500002D0FFF707F8F8E708BDC046C007002013
+:10356000064B074A1B781078DBB2C0B2834201D306
+:10357000273000E00138C01A7047C04634080020E8
+:103580002D080020054B1878054BC0B21B78DBB224
+:10359000984200D24030C01A7047C0462C08002024
+:1035A000C107002010B5124B12491A780B78D2B21D
+:1035B000DBB29A4219D001333F2400209C424041A3
+:1035C000404203400C48DCB2C05C0C700B49C0B2F6
+:1035D000096800290BD09A4200D24032D31A1A2B24
+:1035E00005DC074B1B780B7201E00120404210BD47
+:1035F0002C080020C1070020EB070020BC0700209A
+:10360000EA0700200A4B1A780A4B1B78DBB29A4271
+:103610000AD0013300223F219942524152421340C5
+:10362000054AD05CC0B201E0012040427047C0466C
+:103630002C080020C1070020EB070020064B1A7859
+:10364000064BD2B21A70064B1B68002B02D0054AFB
+:1036500012781A727047C046C10700202C0800205B
+:10366000BC070020EA07002030B52E4A13799906DE
+:1036700024D52D49D4790B78002001333F259D4274
+:103680004041404203402948E4B20078834203D0DD
+:103690002748C454D8B208702649086800280DD0BD
+:1036A00025490978C9B28B4201D35B1A01E05B1A44
+:1036B0004033272B02DD214B1B780371D178194C45
+:1036C000C9B24BB2002B1ADA23795BB2002B16DA9F
+:1036D0001B4B19481D780378DBB29D4202D16C2345
+:1036E000E3700CE00133002427259D4264416442CD
+:1036F0002340144CE45CDBB2E4B2D4710370402389
+:1037000019420ED0117919420BD00F4B00211970BC
+:103710000E4B1B688B4202D00D49097819722C237D
+:10372000D37030BD00C006402C080020C107002027
+:10373000EB070020BC0700202D080020EA0700202E
+:1037400034080020C2070020C007002030080020F5
+:103750002B0800201FB572B6154B70221A70154A3F
+:1037600041211170144A0F21117080221A701A78A9
+:1037700052B2002AFBDA114B186862B6104B98421D
+:1037800001D80A23584301AC211C0A22FEF770FF1E
+:103790000023E15C0B4A002905D0580010180133C2
+:1037A00041800A2BF5D101335B0013701FBDC04669
+:1037B00000000240070002400600024008000240EC
+:1037C0007F969800E403002008B50368C9B21B681F
+:1037D000984708BD08B50368C9B21B68984708BD7B
+:1037E00008B50368C9B21B68984708BD08B50368E7
+:1037F000C9B21B68984708BD08B5044B4808C018F3
+:1038000000F0A2FAFEF75CFF08BDC046C0C62D005E
+:1038100010B5064B4808C018141C00F095FAFEF7C6
+:103820004FFF201CFEF7C0FF10BDC046C0C62D00D4
+:1038300008B5FEF7EBFF08BD08B5081CFFF720F838
+:1038400008BD08B5081CFFF793F808BD08B5081CAB
+:10385000111CFFF737F808BD08B5081CFFF7D0F8B2
+:10386000431E9841C0B208BD08B5081CFFF7EEF82A
+:10387000431E9841C0B208BD08B5FFF767F908BDFF
+:1038800008B5FFF7A3F908BD08B5FFF76FF908BD44
+:1038900008B5FFF73DF908BD08B5FFF7B3F908BD56
+:1038A00008B5FFF741F908BD08B5081CFFF7D0F8C7
+:1038B000012008BD08B5081CFFF7CAF8012008BDA3
+:1038C00010B5081C141C111CFFF716F9201C10BDA4
+:1038D00038B5081C0D1C01F041F9041C211C281CE2
+:1038E000FFF70AF9201C38BD7047FFFF044B002288
+:1038F0001A711A73FA21034A890099601A60704795
+:1039000038080020E053000008B50368C9B21B68FE
+:10391000984708BD08B50368C9B21B68984708BD39
+:1039200008B50368C9B21B68984708BD08B50368A5
+:10393000C9B21B68984708BD08B5044B4808C018B1
+:1039400000F002FAFFF7D4F908BDC04660E31600A4
+:1039500010B5064B4808C018141C00F0F5F9FFF725
+:10396000C7F9201CFFF70CFA10BDC04660E3160033
+:1039700008B5FFF737FA08BD08B5081CFFF76CFA61
+:1039800008BD08B5081CFFF78AFA08BD08B5081C71
+:10399000111CFFF783FA08BD08B5081CFFF780FA71
+:1039A000431E9841C0B208BD08B5081CFFF79EFA37
+:1039B000431E9841C0B208BD08B5FFF717FB08BD0C
+:1039C00008B5FFF753FB08BD08B5FFF71FFB08BD9F
+:1039D00008B5FFF7EDFA08BD08B5FFF763FB08BDB2
+:1039E00008B5FFF7F1FA08BD08B5081CFFF780FA23
+:1039F000012008BD08B5081CFFF77AFA012008BDB0
+:103A000010B5081C141C111CFFF7C6FA201C10BDB1
+:103A100038B5081C0D1C01F0A1F8041C211C281C41
+:103A2000FFF7BAFA201C38BD7047FFFF044B002295
+:103A30001A711A73FA21034A890099601A60704753
+:103A4000480800204054000008B50368C9B21B684C
+:103A5000984708BD08B50368C9B21B68984708BDF8
+:103A600008B50368C9B21B68984708BD08B5036864
+:103A7000C9B21B68984708BD08B5044B4808C01870
+:103A800000F062F9FFF784FB08BDC04660E3160052
+:103A900010B5064B4808C018141C00F055F9FFF784
+:103AA00077FB201CFFF7D8FB10BDC04660E3160073
+:103AB00008B5FFF703FC08BD08B5081CFFF738FC84
+:103AC00008BD08B5081CFFF78DFC08BD08B5081C2B
+:103AD000111CFFF74FFC08BD08B5081CFFF7ACFC34
+:103AE000431E9841C0B208BD08B5081CFFF7CAFCC8
+:103AF000431E9841C0B208BD08B5FFF743FD08BD9D
+:103B000008B5FFF77FFD08BD08B5FFF74BFD08BD01
+:103B100008B5FFF719FD08BD08B5FFF78FFD08BD13
+:103B200008B5FFF71DFD08BD08B5081CFFF7ACFC84
+:103B3000012008BD08B5081CFFF7A6FC012008BD40
+:103B400010B5081C141C111CFFF7F2FC201C10BD42
+:103B500038B5081C0D1C01F001F8041C211C281CA0
+:103B6000FFF7E6FC201C38BD7047FFFF044B002226
+:103B70001A711A73FA21034A890099601A60704712
+:103B800058080020A054000008B50B4B1A68002A02
+:103B900004D001221A60094B1B689847084B1B7818
+:103BA000002B08D0074B1A68002A04D001221A60A3
+:103BB000024B5B68984708BD0C7103406C080020FD
+:103BC0006A0800201C710340064B80221968120409
+:103BD0000A431A60044B00221A60044B01221A7037
+:103BE0007047C0463C800440007003406A080020D3
+:103BF000054B01221A60054B054A19680A401A60F4
+:103C0000044B00221A707047007003403C8004404F
+:103C1000FFFF7FFF6A08002070B544780E4D0F4EFD
+:103C200023015A199B190E4D0669A4004260665182
+:103C3000002483601C60116003221A60094B417BE1
+:103C4000094A1868090402400A431A60074B802297
+:103C5000D2031A6070BDC046007103400871034072
+:103C60006C08002014E400E0FFFF00FF00E100E02A
+:103C7000F8B50C4B061C1B780F1C002B01D1FFF76D
+:103C8000A3FF094D2C78002C04D06B7800208342D0
+:103C900007D10124301C7470391CFFF7BDFF0120CF
+:103CA0002855F8BD6A0800206808002008B5836818
+:103CB00000221A608021074BC90319604178064B26
+:103CC0005A541A78002A04D15B78002B01D1FFF7EF
+:103CD0008FFF08BD80E100E06808002070B5037820
+:103CE000041C0E1C151C002B03D0FFF7DFFF002364
+:103CF00023702661201C291CFFF7BAFF002802D080
+:103D00000123237000E02070207870BD037810B587
+:103D1000041C002B01D0FFF7C9FF0023237010BD46
+:103D200002B4714649084900095C49008E4402BC4E
+:103D30007047C04603B47146490840004900095A1B
+:103D400049008E4403BC7047002934D0012300226F
+:103D500010B488422CD301242407A14204D281420A
+:103D600002D209011B01F8E7E400A14204D281421A
+:103D700002D249005B00F8E7884201D3401A1A4397
+:103D80004C08A04202D3001B5C0822438C08A042CE
+:103D900002D3001B9C082243CC08A04202D3001B84
+:103DA000DC082243002803D01B0901D00909E3E7FE
+:103DB000101C10BC7047002801D00020C04307B47D
+:103DC000024802A14018029003BDC046190000003D
+:103DD0000029F0D003B5FFF7B9FF0EBC4243891AA2
+:103DE0001847C0467047C0468446081C6146FFE736
+:103DF0001FB500F001FA002801D40021C8421FBD00
+:103E000010B500F087F94042013010BD10B500F048
+:103E1000F3F9002801DB002010BD012010BDC046D1
+:103E200010B500F0E9F9002801DD002010BD0120E7
+:103E300010BDC04610B500F097F9002801DC002045
+:103E400010BD012010BDC04610B500F08DF900284E
+:103E500001DA002010BD012010BDC0461C21012345
+:103E60001B04984201D3000C10391B0A984201D35D
+:103E7000000A08391B09984201D30009043902A23B
+:103E8000105C40187047C0460403020201010101A2
+:103E900000000000000000009E2110B5C905041CB0
+:103EA000FFF7D2FF002803D1201C00F091FC10BDC9
+:103EB0009E21C905201C00F015FB00F089FC802321
+:103EC0001B06C018F3E7C046F0B55F4656464D46A0
+:103ED0004446F0B446024500C00F85B00F1C760A78
+:103EE0002D0E804641D0FF2D26D0802424040021B1
+:103EF0002643F6007F3D89468B46F90F7C02780009
+:103F0000640A000E00918A463CD0FF2834D08023FA
+:103F10001B041C430023E4007F380193009F4346A9
+:103F2000019A7B4049469C4611430F2900D971E014
+:103F3000764F89007F58BF46002E3ED108220223CB
+:103F400091469B46D9E75A46341CC24601920199D4
+:103F5000022937D0032900D1CFE0012900D0ABE0FE
+:103F600053460B400022002632E0002E19D10421D6
+:103F7000012289469346C0E7221C531E9A41023211
+:103F80000192CBE701270197002CC7D0201CFFF737
+:103F900065FF431F9C4076235B420021181A019164
+:103FA000BCE7301CFFF75AFF7625431F9E406D4249
+:103FB00000232D1A99469B469FE70C23032199461F
+:103FC0008B469AE7D446012367463B40FF220026F2
+:103FD0007602D205700ADB071043184305B03CBCDB
+:103FE00090469946A246AB46F0BD80260023F603D4
+:103FF000FF22EDE700220026EAE78020C003064208
+:104000003BD0044239D1061C26437602760A009B37
+:10401000FF22DDE7281A039076016401A64239D316
+:10402000361B1A2201230120311C5B007600002977
+:1040300001DBB44201D8361B0343013A002AF3DC0A
+:10404000741EA641341C1C43039A7F32002A27DDCC
+:10405000630704D00F232340042B00D0043427012E
+:1040600003D52B4B039A1C408032FE2A0BDD012323
+:1040700061460B40FF220026AAE706437602760A35
+:104080004346FF22A4E7A40101236746660AD2B291
+:104090003B409DE7039F1B22013F03970023C2E79C
+:1040A0007E23039F5B42DB1B1B2B07DD0123614645
+:1040B0000B40002200268BE7D446C5E7221CDA40DD
+:1040C000039B9E339C40231C5C1EA34113435A0751
+:1040D00004D00F221A40042A00D004335F0105D512
+:1040E000012361460B400122002671E79E016246D2
+:1040F00001231340760A00226AE78026F60326434E
+:104100007602760A5346FF2262E7C046F854000062
+:10411000FFFFFFF74A02430270B55C0A550A4300ED
+:104120004A001B0EC60F120EC90FFF2B05D0FF2A27
+:1041300008D0012093420BD070BD0120002CFBD190
+:10414000FF2AF6D10120002DF6D101209342F3D1B0
+:10415000AC42F1D18E4205D0002BEDD1201C441E83
+:10416000A041E9E70020E7E74A024302F0B55C0A14
+:10417000550A43004A001B0EC60F120EC90FFF2B33
+:1041800031D0FF2A34D0002B16D1604260418446E2
+:10419000002A14D0002820D18E4217D1934215DC7A
+:1041A00004DBAC4212D80020AC4212D27042704103
+:1041B0004042012318430CE0002AEDD194466F429F
+:1041C0006F416046002805D1002FE5D070420123E1
+:1041D0001843F0BD0020002FFBD148424841404227
+:1041E00001231843F5E7002CCBD002204042F0E732
+:1041F000002DC8D0F9E7C0464A024302F0B55C0A78
+:10420000550A43004A001B0EC60F120EC90FFF2BA2
+:1042100027D0FF2A29D0002B10D0002A15D1944690
+:104220006F426F416046002815D00020002F04D156
+:1042300048424841404201231843F0BD604260417A
+:104240008446002AECD00028F2D18E4211D0704270
+:1042500001231843F1E7002FF7D0704201231843E0
+:10426000EBE70220002CE8D1D3E70220002DE4D1B7
+:10427000D1E79342EBDC04DBAC42E8D80020AC424F
+:10428000DBD270427041404201231843D5E7C0465B
+:10429000F0B55F4656464D464446F0B444024600EB
+:1042A00083B00F1C640A360EC50F002E41D0FF2EBE
+:1042B00022D080231B0400201C43E4007F3E824662
+:1042C0008046391C4B007F02C90F7F0A1B0E8B46AC
+:1042D0003BD0FF2B34D0802212041743FF007F3BDA
+:1042E00000215A466A40019252460A430F2A63D877
+:1042F0007A48920082589746002C3FD10822022328
+:1043000092469846DDE70195404602282AD1019A57
+:1043100001251540FF2300246402DB05600AED0738
+:104320001843284303B03CBC90469946A246AB468E
+:10433000F0BD002C27D10420012282469046C0E720
+:10434000391C4A1E91410231CBE70121002FC8D010
+:10435000381CFFF783FD431F9F4076235B421B1AE7
+:104360000021BEE7032800D1AEE001284FD101981B
+:1043700042461040C5B200230024CDE70C230320A1
+:104380009A4680469DE7201CFFF768FD7626431F6E
+:104390009C4076420023361A9A46984691E780243C
+:1043A0000025E403FF23B7E75B463C1C01938846E6
+:1043B000AAE73C1C8846A7E7250C24043A0C240CE9
+:1043C0003F04F6183F0C211C231C794353436F43D1
+:1043D0005543FB180A0C9B18B1469F4202D9802214
+:1043E0005202AD1809041A04090C521894011B0C4E
+:1043F000611E8C41920EED181443AD012C43230134
+:1044000005D5012263080120144081441C434B461A
+:104410007F33002B2DDD600704D00F222240042AB9
+:1044200000D00434220103D52D4B1C404B46803371
+:10443000FE2B17DD019B01251D400024FF236BE7A8
+:104440008020C003044208D0074206D1041C3C432C
+:104450006402640A5D46FF235EE704436402640A63
+:10446000FF2359E70198A4010125640ADBB2054046
+:1044700052E77E235B424A469B1A1B2B05DD019BBC
+:1044800001251D400024002346E7221CDA404B464C
+:104490009E339C40231C5C1EA3411343580704D049
+:1044A0000F221A40042A00D004335A0105D5019B7B
+:1044B00001251D40002401232EE701989C010125C0
+:1044C000640A0540002327E78027FF03019B3C4344
+:1044D000640201251D40640AFF231DE738550000D2
+:1044E000FFFFFFF7F8B5C20F430244004D0248003A
+:1044F000240E161C9B09000EC90FAD09FF2800D120
+:1045000083E0012779408A425CD0221A002A00DC2D
+:104510008EE000281ED1002D00D07AE0580704D08C
+:104520000F221A40042A00D004338021C90401223A
+:104530001940324000293AD00134FF2C00D183E0E9
+:104540009B015B0A5B02E4B2E405580AD2072043F0
+:104550001043F8BDFF2CE1D08021C9040D431B2A74
+:1045600000DD31E1291C2020D140821A95406A1ECD
+:1045700095410D435B1B5801D0D59B019F09381C09
+:10458000FFF76CFC421F974094425FDC141B1F2313
+:104590001B1B3A1C9F40611C3B1CCA405F1EBB4159
+:1045A00013430024BAE7131EB8D100230022DB080E
+:1045B000FF2C04D1002B47D08020C00303435B02B3
+:1045C0005B0ABFE7211A002944DD002827D0FF2C11
+:1045D000A4D08020C00405431B2900DDF2E0281C84
+:1045E0002027C840791A8D40691E8D4105435B190B
+:1045F000590100D492E70134FF2C59D073490122AC
+:104600001A400B405B08134388E7002D00D07AE77F
+:1046100077E7013A002AADD0FF2CA0D17EE7002D2C
+:1046200000D17BE701390029E1D0FF2CD4D175E717
+:10463000002A1BD1621CD2B2012A4BDD5F1B7A011A
+:1046400023D5EF1A0E1C9AE700237BE75F4BA41AD1
+:104650003B4063E7002946D1611CC8B2012829DD2F
+:10466000FF2924D0EB185B080C1C57E7002C13D053
+:10467000FF2818D08024E404524223431B2A4DDD36
+:104680000123EB1A041C0E1C75E7002F00D076E7FF
+:104690000023002200248AE7002B3BD0D243002ACB
+:1046A000EFD0FF28EAD12B1CFF240E1C36E7FF2495
+:1046B00000237CE7002C5CD1002B00D180E0002D92
+:1046C00000D12BE75B19580100D427E73F4A0124AA
+:1046D000134023E7002C15D1002B40D1002D63D0CF
+:1046E0002B1C0E1C1AE7002C21D1002B54D0C943DF
+:1046F000002904D0FF284CD01B2958DD01235B1969
+:10470000041C75E7002B19D1002D48D02B1C0E1C62
+:10471000FF2403E72B1C041C0E1CFFE61C1C202698
+:10472000D440B21A93405A1E93412343A9E7FF286D
+:104730002FD08024E40449422343DDE7FF24002DE9
+:1047400000D1EBE68022DB08D203134204D0ED084F
+:10475000154201D12B1C0E1CDB00FF24DEE6002DD0
+:1047600000D1DBE65A1B500100D41CE7EB1A0E1CEB
+:10477000D4E6002B0DD0FF24002D00D1CEE6802200
+:10478000DB08D2031342E7D0ED081542E4D12B1C1D
+:10479000E2E72B1CFF24C1E62B1C041CBEE6802391
+:1047A00000229B04FF2402E7231C0022FFE61C1CBE
+:1047B0002027CC40791A8B40591E8B4123439EE71A
+:1047C0002B1CABE6012512E70125D3E6FFFFFFFB1B
+:1047D0004302590A4300C20F1B0E00207E2B0DDD41
+:1047E0009D2B0CDC802000040143952B0ADC9620D5
+:1047F000C31AD9404842002A00D1081C7047034B15
+:10480000D018FBE7963B9940F4E7C046FFFFFF7FD7
+:1048100010B5041E33D0FFF721FB9E231B1A962BE5
+:1048200009DC083884406402640ADBB26402DB05F8
+:10483000600A184310BD992B0ADD0522121A211CAB
+:10484000D1400A1C011C1B318C40611E8C41144359
+:10485000052801DD421F9440144A2240610704D01C
+:104860000F210C40042C00D0043251010AD59F23A3
+:10487000181AFF2816D09401640AC3B2D6E70023A1
+:104880000024D3E7D208FF2B03D05402640ADBB222
+:10489000CCE7002A06D08024E40314436402640AAF
+:1048A000FF23C3E7FF230024C0E7C046FFFFFFFB51
+:1048B00008B5031C081C191C00F002F808BDFFFF16
+:1048C00038B5051C05480C1C131C002804D0022018
+:1048D000291C221C00E000BF38BDC04600000000BB
+:1048E00070B50E4B0E4D0024ED1AAD101E1CAC42DF
+:1048F00004D0A300F35898470134F8E700F058FEBD
+:10490000084B094D0024ED1AAD101E1CAC4204D01A
+:10491000A300F35898470134F8E770BDBC55000078
+:10492000BC550000BC550000D855000008B5034B2D
+:10493000011C186800F02EF808BDC0465C04002079
+:1049400010B50023934203D0CC5CC4540133F9E783
+:1049500010BD70B5814201D300230CE08C18A04239
+:10496000FAD28518131C013B0BD351426618F65C32
+:104970006918CE54F7E7934203D0CC5CC45401339A
+:10498000F9E770BD031C8218934202D019700133FD
+:10499000FAE7704730B5002940D004390B68002B86
+:1049A00000DAC9181E4A1368141C002B02D14B6090
+:1049B000116033E099420FD208680A189A4205D173
+:1049C00013685268C01808604A6000E04B602160BC
+:1049D00024E08A4203D8131C5A68002AF9D11D68C2
+:1049E0005C198C420BD109686918581819609042FB
+:1049F00014D114685268091919605A600EE08C428B
+:104A000002D90C23036009E008680C18944203D112
+:104A100014685268001908604A60596030BDC04689
+:104A20007808002070B50323CD1C9D430835061C73
+:104A30000C2D01D20C2501E0002D3FDB8D423DD332
+:104A4000204B1C681A1C211C002913D00868431B2A
+:104A50000DD40B2B02D90B60CC181EE08C4202D176
+:104A6000636813601AE0486860600C1C16E00C1C58
+:104A70004968E9E7144C2068002803D1301C00F095
+:104A800031F82060301C291C00F02CF8431C15D094
+:104A9000C41C03239C4384420AD12560201C0B3094
+:104AA0000722231D9043C31A0BD05A42E25008E05C
+:104AB000211A301C00F016F80130EED10C233360BF
+:104AC000002070BD780800207408002008B50A1C7A
+:104AD0000349031C0868191C00F02DFB08BDC046E3
+:104AE0005C04002038B5074C0023051C081C23601B
+:104AF000FDF78AFD431C03D12368002B00D02B60F7
+:104B000038BDC046D40800200EB400B59CB01DAB23
+:104B100004CB822202A992008A810A4A02908A600A
+:104B20004A6101225242CA81074A086110681D9AEF
+:104B3000019300F07BF8029A002313701CB008BCAC
+:104B400003B01847FFFFFF7F5C040020031C0A78B6
+:104B500001311A700133002AF9D170470023C25C79
+:104B60000133002AFBD1581E7047FFFFF0B58D6856
+:104B700085B0071C0C1C03920193AB4245D39022D5
+:104B80008B89D20013423DD06269032656430969DE
+:104B90002068F20F401A96190290021C0198013207
+:104BA00012187610964200D2161C381C5A050FD5E2
+:104BB000311CFFF737FF051E13D0029A2169FFF75A
+:104BC000BFFEA289184B134080221343A38111E03A
+:104BD000321C00F0B0FA051E0CD1381C2169FFF719
+:104BE000D9FE0C233B60A389402213430120A381FB
+:104BF000404217E0029B2561ED1825606661019D2A
+:104C0000F61AA6600198A84200D2019D2A1C2068CD
+:104C10000399FFF79EFEA2680020531BA360236840
+:104C20005D19256005B0F0BD7FFBFFFFF0B59FB0BB
+:104C3000039005938B890E1C171C19060FD532693A
+:104C4000002A0CD14021FFF7EDFE306030610028D2
+:104C500003D103990C230B60C9E04023736106ADB7
+:104C600000236B6120236B763023AB763C1C2378CA
+:104C7000002B03D1E21B029211D003E0252BF9D0C7
+:104C80000134F4E70398311C3A1C029BFFF76EFFD6
+:104C9000013000D1A6E06969029A8B186B61237814
+:104CA000002B00D19EE0012252426A606A46002336
+:104CB0005B3201342B60EB60AB601370AB654E4F21
+:104CC0002178381C052200F02BFA002807D0C71BDA
+:104CD0002B680120B840184328600134EFE72B68A7
+:104CE000D90603D56A4620215B3211701A0703D515
+:104CF0006A462B215B32117022782A2A01D0099B47
+:104D00000EE0059A111D12680591002A01DB099237
+:104D100004E05242EA60022213432B60013409E0AE
+:104D20002278303A092A04D80A214B4301349B18CF
+:104D3000F6E7099323782E2B18D163782A2B09D113
+:104D4000059B02341A1D1B680592002B0DDA012306
+:104D50005B420AE0013400232278303A092A04D861
+:104D60000A214B4301349B18F6E70793234F217820
+:104D7000381C032200F0D4F9002806D0C71B2B688A
+:104D80004020B84018432860013421781C4806228E
+:104D9000671C297600F0C4F9002812D0194B002BAB
+:104DA00006D1059B0722073393430833059314E08C
+:104DB00005AB00930398291C321C134B00E000BF85
+:104DC00007E005AB00930398291C321C0E4B00F042
+:104DD00091F804900499013104D06A690499531838
+:104DE0006B6143E7B3895A0601D40B9801E00120B7
+:104DF00040421FB0F0BDC0467A550000805500000B
+:104E000084550000000000006D4B0000F7B5151C34
+:104E100001930A698B68061C0C1C934200DA131C70
+:104E2000221C2B6043321278002A01D001332B6000
+:104E30002068800602D52B6802332B602168062784
+:104E40000F401FD0231C43331B785A1E9341226806
+:104E500092061FD5E11840313020C870211C5A1C21
+:104E600045310978A21840320233D17012E0221C79
+:104E7000301C019919320123089FB847013011D025
+:104E8000009F01370097E0682968009F431A9F42FE
+:104E9000EDDBD7E7221C301C01994332089FB8474D
+:104EA000013002D10120404223E0206806212B6816
+:104EB000E26801400025042903D1D51AEB43DB1732
+:104EC0001D40A26823699A4201DDD31AED1800271C
+:104ED0000097009FAF420BDA221C301C01991A3256
+:104EE0000123089FB8470130DCD0009F0137EFE76E
+:104EF0000020FEBDF0B50D1C8BB043350692059029
+:104F0000079304950B7E0C1C109A6E2B00D1A7E022
+:104F100011D8632B22D009D8002B00D1B0E0582B38
+:104F200000D0C0E045310B707B4D4EE0642B1CD0AF
+:104F3000692B1AD0B7E0732B00D1A5E009D86F2BED
+:104F400029D0702B00D0AEE00E68202333430B60D5
+:104F500036E0752B1FD0782B32D0A4E013680D1CDF
+:104F6000191D423511601B689FE0216813680E0609
+:104F700003D5191D11601E6805E04806F9D5191DF5
+:104F8000116000215E5E644B002E3BDA049D2D22F1
+:104F900076422A7036E0216813680E0603D5191D83
+:104FA00011601E6804E04806F9D5191D1E881160BD
+:104FB000594B227E039308276F2A1ED00A271CE034
+:104FC000231C78214533554D197011682368081D3D
+:104FD000039510601E0601D50E6802E05806FBD549
+:104FE0000E88D90702D52022134323601027002EF4
+:104FF00003D1226820239A432260231C00224333DA
+:105000001A7001E003930A276368A360002B03DB97
+:105010002568042295432560002E02D1049D002BB3
+:105020000ED0049D301C391CFEF7D2FE0398013DC2
+:10503000435C301C2B70391CFEF786FE061EF1D136
+:10504000082F09D12168C90706D5626823699A42E9
+:1050500002DC013D30232B70049E731B23612AE088
+:10506000086813684969050604D5181D10601B6897
+:10507000196005E04606F8D5181D10601B681980F8
+:1050800000232361049D16E01368191D11601D683B
+:10509000281CFFF763FD63682061984200D92361F3
+:1050A0002069606004E0251C42352B7001232361D8
+:1050B000049E00233370079E05980096211C09AAC0
+:1050C000069BFFF7A3FE013002D10120404221E000
+:1050D0002A1C059806992369079DA8470130F4D03A
+:1050E0002668B60705D4099BE068984212DA181CB6
+:1050F00010E00025E0680999431A9D42F3DA221C6A
+:105100000598069919320123079EB0470130DCD07B
+:105110000135EFE70BB0F0BD8B5500009C5500004A
+:10512000C9B28218904204D003788B4202D0013079
+:10513000F8E700207047F8B5061C0C1C151C002968
+:1051400004D1111CFFF76EFC041C18E0002A03D1E7
+:10515000FFF720FC2C1C12E000F013F8A8420ED23E
+:10516000301C291CFFF75EFC071E07D0211C2A1CDF
+:10517000FFF7E6FB301C211CFFF70CFC3C1C201C3D
+:10518000F8BD04390B68181F002B02DAC8581B1829
+:10519000181F7047256C6400256C75004720256337
+:1051A00020256C6420256420256400656E640074ED
+:1051B0002000360020473A002050445F7363726538
+:1051C000656E3A002050445F6C617365723A005519
+:1051D0006E6B6E6F776E20636F6D6D616E643A20DB
+:1051E00000050E08090D0C06070F0B004417FF05FC
+:1051F0000E08090D0C06070F0B004417FFFFFFFFF9
+:10520000FFFFFFFFFFFFFF1A1BFFFFFF420000F839
+:1052100040A0044001000000420000F844A0044007
+:1052200002000000C00000F800C0044001000000BF
+:10523000000000F80490044002000000000000F8A4
+:105240000890044004000000C00000F81CC00440A6
+:1052500080000000C00000F810C0044010000000F2
+:10526000C00000F808C0044004000000C00000F8BE
+:105270000CC0044008000000800000F80CB004409E
+:1052800008000000800000F810B00440100000008A
+:10529000800000F818B0044040000000800000F8D2
+:1052A0001CB0044080000000800000F814B00440EE
+:1052B00020000000C00000F804C00440020000000C
+:1052C000800000F800B0044001000000400000F839
+:1052D00000A0044001000000400000F804A00440C9
+:1052E00002000000400000F80CA00440080000008C
+:1052F000400000F808A0044004000000C00000F8CE
+:1053000014C0044020000000C00000F818C0044091
+:1053100040000000800000F804B0044002000000DB
+:10532000800000F808B0044004000000020100F80A
+:1053300050D0044010000000020100F854D0044096
+:1053400020000000030100F878D004404000000075
+:105350000000000000000000312500003B25000097
+:105360000925000011250000192500002125000055
+:1053700029250000000000001519151519FFFFFF71
+:1053800000010000070300201200000000020000DE
+:10539000320300209500000000030000E00300201D
+:1053A00000000000010309041A03002000000000AF
+:1053B00002030904C80300200000000003030904DD
+:1053C000E4030020000000000000000000000000D6
+:1053D00000000000FFFFFFFF0000000000000000D1
+:1053E000A9380000C1380000793800008938000071
+:1053F0008138000091380000F937000011380000B2
+:105400003138000039380000433800004D380000C2
+:10541000593800006938000099380000A1380000B0
+:10542000C9370000D5370000E1370000ED37000034
+:10543000D1380000B5380000000000000000000076
+:10544000E9390000013A0000B9390000C93900000B
+:10545000C1390000D139000039390000513900004C
+:105460007139000079390000833900008D3900005E
+:1054700099390000A9390000D9390000E13900004C
+:105480000939000015390000213900002D390000CC
+:10549000113A0000F5390000000000000000000093
+:1054A000293B0000413B0000F93A0000093B0000A5
+:1054B000013B0000113B0000793A0000913A0000E6
+:1054C000B13A0000B93A0000C33A0000CD3A0000FA
+:1054D000D93A0000E93A0000193B0000213B0000E6
+:1054E000493A0000553A0000613A00006D3A000068
+:1054F000513B0000353B000014400000C63F000057
+:10550000F43F00004E3F0000F43F0000EA3F00007F
+:10551000F43F00004E3F0000C63F0000C63F0000C1
+:10552000EA3F00004E3F0000463F0000463F0000BB
+:10553000463F0000FA3F0000B8430000B2430000BD
+:10554000B2430000A84300000843000008430000E5
+:105550009E430000A8430000084300009E43000053
+:1055600008430000A8430000064300000643000073
+:1055700006430000404400004300232D302B200050
+:10558000686C4C00656667454647003031323334FD
+:10559000353637383941424344454600303132339D
+:1055A00034353637383961626364656600FFFFFF62
+:1055B000F8B5C046F8BC08BC9E46704739040000E8
+:1055C000B90C00002923000049250000ED38000037
+:0855D0002D3A00006D3B0000C4
+:1055D800000000009C04002014050020AC040020FA
+:1055E8007C040020FC0400200A040000C90E00000E
+:1055F800C90E0000C90E0000C90E0000C90E000047
+:10560800C90E0000C90E0000C90E0000C90E000036
+:10561800C90E0000C90E0000C90E0000C90E000026
+:10562800C90E0000C90E0000C90E0000C90E000016
+:10563800C90E0000C90E0000C90E0000C90E000006
+:10564800C90E0000C90E0000C90E0000C90E0000F6
+:10565800C90E0000C90E0000FFFFFFFFFF00000099
+:10566800D80800200107081201010100000040C00D
+:1056780016890400020102030100180354006500A2
+:1056880065006E00730079006400750069006E00A3
+:105698006F0009029500030100C032080B000202E6
+:1056A800020104090400000102020100052400109F
+:1056B800010524010101042402060524060001074E
+:1056C80005810310004009040100020A00000007D8
+:1056D8000502024000000705830240000009040299
+:1056E8000002010300000724010001410006240212
+:1056F8000101000624020202000924030103010239
+:105708000100092403020401010100090505024002
+:105718000000000005250101010905840240000080
+:105728000000052501010300180354006500650009
+:105738006E007300790020004D00490044004900C4
+:10574800040309040C03000000000000000000002E
+:105758000000000000000000000000000000000041
+:105768000000000000000000000000000000000031
+:105778000000000000000000000000007855000054
+:105788000000000000000000000000000000000011
+:105798000000000000000000000000000000000001
+:1057A80000000000000000000000000000000000F1
+:1057B800000000000000000000000000FC030020C2
:00000001FF
diff --git a/android/WALT/app/src/main/res/values/dimens.xml b/android/WALT/app/src/main/res/values/dimens.xml
index 47c8224..5ee798a 100644
--- a/android/WALT/app/src/main/res/values/dimens.xml
+++ b/android/WALT/app/src/main/res/values/dimens.xml
@@ -1,5 +1,4 @@
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
</resources>
diff --git a/android/WALT/app/src/main/res/values/strings.xml b/android/WALT/app/src/main/res/values/strings.xml
index 7204eaa..bc83273 100644
--- a/android/WALT/app/src/main/res/values/strings.xml
+++ b/android/WALT/app/src/main/res/values/strings.xml
@@ -1,7 +1,6 @@
<resources>
<string name="app_name">WALT</string>
- <string name="action_settings">Settings</string>
<string name="title_activity_crash_log">Crash Log</string>
<string name="protocol_version_mismatch">WALT reports protocol version %1$s, which is not
supported. Please program WALT to a firmware with protocol version %2$s. To do this
@@ -16,6 +15,7 @@
<string name="disclaimer">DISCLAIMER: This is not an official Google product.</string>
<string name="more_info">A WALT device is required to run the latency tests. For more information, visit github.com/google/walt</string>
<string name="privacy_policy">Privacy policy:\ngithub.com/google/walt/blob/master/docs/PrivacyPolicy.md</string>
+ <string name="hint_url">Enter URL</string>
<string name="preference_screen_blinks" translatable="false">pref_screen_blinks</string>
<string name="preference_audio_in_reps" translatable="false">pref_audio_in_reps</string>
<string name="preference_audio_in_threshold" translatable="false">pref_audio_in_threshold</string>
@@ -29,6 +29,36 @@
<string name="preference_screen_fullscreen">pref_screen_fullscreen</string>
<string name="preference_log_url">pref_log_url</string>
<string name="preference_auto_upload_log">pref_auto_upload_log</string>
+ <string name="start">Start</string>
+ <string name="close">Close</string>
+ <string name="reconnect">Reconnect</string>
+ <string name="tbd_conn_status">TBD: Conn status</string>
+ <string name="tap_latency">Tap latency</string>
+ <string name="drag_latency">Drag latency</string>
+ <string name="screen_response">Screen response</string>
+ <string name="audio_latency">Audio latency</string>
+ <string name="midi_latency">MIDI latency</string>
+ <string name="view_log">View log</string>
+ <string name="accelerometer_latency">Accelerometer latency</string>
+ <string name="settings">Settings</string>
+ <string name="about">About</string>
+ <string name="diagnostics">Diagnostics</string>
+ <string name="tbd_connection_sync_status">TBD: Connection/sync status</string>
+ <string name="ping">Ping</string>
+ <string name="ping_over_usb_with_1_byte">Ping over USB with 1 byte</string>
+ <string name="re_sync_clocks">Re-sync clocks</string>
+ <string name="check_clock_drift">Check clock drift</string>
+ <string name="check_how_much_clocks_diverged">Check how much clocks diverged</string>
+ <string name="update_walt_firmware">Update WALT Firmware</string>
+ <string name="please_press_the_button_on_the_teensy_first">Please press the button on the Teensy first</string>
+ <string name="finish">Finish</string>
+ <string name="restart">Restart</string>
+ <string name="stop">Stop</string>
+ <string name="start_midi_in">Start MIDI in</string>
+ <string name="start_midi_out">Start MIDI out</string>
+ <string name="upload">Upload</string>
+ <string name="share">Share</string>
+ <string name="help">Help</string>
<string-array name="audio_mode_array">
<item>Continuous Playback Latency</item>
<item>Continuous Recording Latency</item>
diff --git a/android/WALT/app/src/main/res/values/styles.xml b/android/WALT/app/src/main/res/values/styles.xml
index 02095e7..05e7a67 100644
--- a/android/WALT/app/src/main/res/values/styles.xml
+++ b/android/WALT/app/src/main/res/values/styles.xml
@@ -6,7 +6,6 @@
<item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
<item name="colorAccent">@color/ColorAccent</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
- <item name="android:imageButtonStyle">@style/ImageButtonStyle</item>
<item name="imageButtonStyle">@style/ImageButtonStyle</item>
<!-- the homeAsUpIndicator doesn't work with either png or xml icons -->
<!--<item name="android:homeAsUpIndicator">@drawable/ic_chevron_left_black_24dp</item> -->
@@ -16,7 +15,7 @@
<style name="MenuDivider">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">1dp</item>
- <item name="android:background">?android:attr/listDivider</item>
+ <item name="background">?android:attr/listDivider</item>
<item name="android:layout_marginLeft">72dp</item>
</style>
diff --git a/android/WALT/app/src/main/res/xml/backup_rules.xml b/android/WALT/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..0e782d2
--- /dev/null
+++ b/android/WALT/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<full-backup-content>
+ <include domain="root" />
+</full-backup-content> \ No newline at end of file
diff --git a/android/WALT/app/src/main/res/xml/preferences.xml b/android/WALT/app/src/main/res/xml/preferences.xml
index 6482571..58a64f6 100644
--- a/android/WALT/app/src/main/res/xml/preferences.xml
+++ b/android/WALT/app/src/main/res/xml/preferences.xml
@@ -1,7 +1,7 @@
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:walt="http://schemas.android.com/apk/res/org.chromium.latency.walt">
+<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:walt="http://schemas.android.com/apk/res-auto">
- <android.support.v7.preference.PreferenceScreen
+ <androidx.preference.PreferenceScreen
android:key="pref_general_screen"
android:persistent="false"
android:title="General">
@@ -28,9 +28,9 @@
</PreferenceCategory>
- </android.support.v7.preference.PreferenceScreen>
+ </androidx.preference.PreferenceScreen>
- <android.support.v7.preference.PreferenceScreen
+ <androidx.preference.PreferenceScreen
android:key="pref_tap_screen"
android:persistent="false"
android:title="Tap latency">
@@ -40,9 +40,9 @@
android:title="Show live histogram for tap test"
android:defaultValue="true" />
- </android.support.v7.preference.PreferenceScreen>
+ </androidx.preference.PreferenceScreen>
- <android.support.v7.preference.PreferenceScreen
+ <androidx.preference.PreferenceScreen
android:key="pref_screen_response_screen"
android:persistent="false"
android:title="Screen response">
@@ -71,9 +71,9 @@
android:title="Test in fullscreen mode"
android:defaultValue="true" />
- </android.support.v7.preference.PreferenceScreen>
+ </androidx.preference.PreferenceScreen>
- <android.support.v7.preference.PreferenceScreen
+ <androidx.preference.PreferenceScreen
android:key="pref_audio_screen"
android:persistent="false"
android:title="Audio">
@@ -105,9 +105,9 @@
walt:maxValue="100000"
walt:minValue="1" />
- </android.support.v7.preference.PreferenceScreen>
+ </androidx.preference.PreferenceScreen>
- <android.support.v7.preference.PreferenceScreen
+ <androidx.preference.PreferenceScreen
android:key="pref_midi_screen"
android:persistent="false"
android:title="MIDI">
@@ -130,6 +130,6 @@
walt:maxValue="1000"
walt:minValue="1" />
- </android.support.v7.preference.PreferenceScreen>
+ </androidx.preference.PreferenceScreen>
-</android.support.v7.preference.PreferenceScreen>
+</androidx.preference.PreferenceScreen>
diff --git a/android/WALT/app/src/test/java/org/chromium/latency/walt/AccelerometerFragmentTest.java b/android/WALT/app/src/test/java/org/chromium/latency/walt/AccelerometerFragmentTest.java
new file mode 100644
index 0000000..7a70426
--- /dev/null
+++ b/android/WALT/app/src/test/java/org/chromium/latency/walt/AccelerometerFragmentTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.chromium.latency.walt;
+
+import com.github.mikephil.charting.data.Entry;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import static org.junit.Assert.assertEquals;
+
+public class AccelerometerFragmentTest {
+
+ @Test
+ public void testSmoothEntries() {
+ Random rand = new Random(1234);
+ List<Entry> entries = new ArrayList<>();
+ for (int i = 1; i <= 400; i++) {
+ entries.add(new Entry(i, i + rand.nextFloat()*0.01f));
+ }
+ final List<Entry> smoothEntries = AccelerometerFragment.smoothEntries(entries, 4);
+ for (Entry e : smoothEntries) {
+ assertEquals(e.getX(), e.getY(), 1e-2);
+ }
+ }
+
+ @Test
+ public void testFindShifts() {
+ Random rand = new Random(5678);
+ List<Entry> phoneEntries = new ArrayList<>();
+ List<Entry> waltEntries = new ArrayList<>();
+ for (int i = 0; i < 1000; i++) {
+ if (i % 3 == 0)
+ phoneEntries.add(new Entry(i, (float) Math.sin((i - 12)*Math.PI/100)));
+ waltEntries.add(new Entry(i, (float) Math.sin(i*Math.PI/100)*rand.nextFloat() + rand.nextFloat()*0.2f - 0.1f));
+ }
+ final double[] shifts = AccelerometerFragment.findShifts(phoneEntries, waltEntries);
+ for (double d : shifts) {
+ System.out.println(d);
+ }
+ assertEquals(12, Utils.argmax(shifts)/10d, 1e-9);
+ }
+}
diff --git a/android/WALT/app/src/test/java/org/chromium/latency/walt/HistogramChartTest.java b/android/WALT/app/src/test/java/org/chromium/latency/walt/HistogramChartTest.java
index 8365719..c43eca1 100644
--- a/android/WALT/app/src/test/java/org/chromium/latency/walt/HistogramChartTest.java
+++ b/android/WALT/app/src/test/java/org/chromium/latency/walt/HistogramChartTest.java
@@ -29,7 +29,7 @@ import org.powermock.modules.junit4.PowerMockRunner;
import java.util.ArrayList;
-import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
diff --git a/android/WALT/app/src/test/java/org/chromium/latency/walt/TraceLoggerTest.java b/android/WALT/app/src/test/java/org/chromium/latency/walt/TraceLoggerTest.java
index ed617cb..f3a3c0d 100644
--- a/android/WALT/app/src/test/java/org/chromium/latency/walt/TraceLoggerTest.java
+++ b/android/WALT/app/src/test/java/org/chromium/latency/walt/TraceLoggerTest.java
@@ -21,7 +21,7 @@ import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
-import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
diff --git a/android/WALT/app/src/test/java/org/chromium/latency/walt/UtilsTest.java b/android/WALT/app/src/test/java/org/chromium/latency/walt/UtilsTest.java
index bf77e05..33d8454 100644
--- a/android/WALT/app/src/test/java/org/chromium/latency/walt/UtilsTest.java
+++ b/android/WALT/app/src/test/java/org/chromium/latency/walt/UtilsTest.java
@@ -16,15 +16,18 @@
package org.chromium.latency.walt;
+import com.github.mikephil.charting.data.Entry;
+
import org.junit.Test;
import java.util.ArrayList;
+import java.util.List;
import java.util.Random;
import static java.lang.Double.NaN;
-import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertThat;
+import static org.hamcrest.MatcherAssert.assertThat;
public class UtilsTest {
@@ -159,4 +162,31 @@ public class UtilsTest {
}
assertEquals(latency, Utils.findBestShift(laserTimes, touchTimes, touchY), 1e-6);
}
+
+ @Test
+ public void testMeanEntries() {
+ List<Entry> entries = new ArrayList<>();
+ for (int i = 1; i <= 10; i++) {
+ entries.add(new Entry(i, i));
+ }
+ assertEquals(5.5, Utils.mean(entries), 1e-12);
+ }
+
+ @Test
+ public void testMinEntries() {
+ List<Entry> entries = new ArrayList<>();
+ for (int i = 1; i <= 10; i++) {
+ entries.add(new Entry(i, i));
+ }
+ assertEquals(1, Utils.min(entries), 1e-12);
+ }
+
+ @Test
+ public void testMaxEntries() {
+ List<Entry> entries = new ArrayList<>();
+ for (int i = 1; i <= 10; i++) {
+ entries.add(new Entry(i, i));
+ }
+ assertEquals(10, Utils.max(entries), 1e-12);
+ }
}
diff --git a/android/WALT/build.gradle b/android/WALT/build.gradle
index aaedccb..fddf29e 100644
--- a/android/WALT/build.gradle
+++ b/android/WALT/build.gradle
@@ -2,10 +2,11 @@
buildscript {
repositories {
+ google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle-experimental:0.8.3'
+ classpath 'com.android.tools.build:gradle:3.6.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -14,7 +15,12 @@ buildscript {
allprojects {
repositories {
+ google()
jcenter()
maven { url "https://jitpack.io" }
}
+
+ tasks.withType(JavaCompile) {
+ options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
+ }
}
diff --git a/android/WALT/gradle.properties b/android/WALT/gradle.properties
index 1d3591c..915f0e6 100644
--- a/android/WALT/gradle.properties
+++ b/android/WALT/gradle.properties
@@ -15,4 +15,6 @@
# 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 \ No newline at end of file
+# org.gradle.parallel=true
+android.enableJetifier=true
+android.useAndroidX=true \ No newline at end of file
diff --git a/android/WALT/gradle/wrapper/gradle-wrapper.jar b/android/WALT/gradle/wrapper/gradle-wrapper.jar
index 05ef575..01b8bf6 100644
--- a/android/WALT/gradle/wrapper/gradle-wrapper.jar
+++ b/android/WALT/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/android/WALT/gradle/wrapper/gradle-wrapper.properties b/android/WALT/gradle/wrapper/gradle-wrapper.properties
index aa3841f..674bdda 100644
--- a/android/WALT/gradle/wrapper/gradle-wrapper.properties
+++ b/android/WALT/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Tue Nov 29 15:45:52 EST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
diff --git a/android/WALT/gradlew b/android/WALT/gradlew
index 9d82f78..cccdd3d 100755
--- a/android/WALT/gradlew
+++ b/android/WALT/gradlew
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
##############################################################################
##
@@ -6,20 +6,38 @@
##
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# 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\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
-warn ( ) {
+warn () {
echo "$*"
}
-die ( ) {
+die () {
echo
echo "$*"
echo
@@ -30,6 +48,7 @@ die ( ) {
cygwin=false
msys=false
darwin=false
+nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
@@ -40,26 +59,11 @@ case "`uname`" in
MINGW* )
msys=true
;;
+ NONSTOP* )
+ nonstop=true
+ ;;
esac
-# 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\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
@@ -85,7 +89,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -150,11 +154,19 @@ if $cygwin ; then
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=("$@")
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"
diff --git a/android/WALT/gradlew.bat b/android/WALT/gradlew.bat
index aec9973..e95643d 100644
--- a/android/WALT/gradlew.bat
+++ b/android/WALT/gradlew.bat
@@ -8,14 +8,14 @@
@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 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=
+
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
@@ -46,10 +46,9 @@ echo location of your Java installation.
goto fail
:init
-@rem Get command-line arguments, handling Windowz variants
+@rem Get command-line arguments, handling Windows 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.
@@ -60,11 +59,6 @@ set _SKIP=2
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
diff --git a/arduino/walt/walt.ino b/arduino/walt/walt.ino
index ddb7c95..4704383 100644
--- a/arduino/walt/walt.ino
+++ b/arduino/walt/walt.ino
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#define VERSION "5"
+#define VERSION "6"
// Commands
// Digits 1 to 9 reserved for clock sync
@@ -46,6 +46,8 @@
#define CMD_MIDI 'M'
#define CMD_NOTE 'N'
+#define CMD_ACCELEROMETER_CURVE 'O'
+
#define NOTE_DELAY 10000 // 10 ms
// Message types for MIDI encapsulation
@@ -64,6 +66,7 @@
#define PD_LASER_PIN 14
#define PD_SCREEN_PIN 20 // Same as A6
#define G_PIN 15 // Same as A1
+#define GZ_PIN 16 // Same as A2
#define AUDIO_PIN 22 // Same as A8
#define MIC_PIN 23 // Same as A9
@@ -211,6 +214,7 @@ void setup() {
// Sensors
pinMode(PD_SCREEN_PIN, INPUT);
pinMode(G_PIN, INPUT);
+ pinMode(GZ_PIN, INPUT);
pinMode(PD_LASER_PIN, INPUT_PULLUP);
attachInterrupt(PD_LASER_PIN, irq_laser, CHANGE);
@@ -244,6 +248,25 @@ void run_brightness_curve() {
send_line();
}
+void run_accelerometer_curve() {
+ int i;
+ long t;
+ int v;
+ digitalWrite(DEBUG_LED1, HIGH);
+ for (i = 0; i < 4000; i++) {
+ v = analogRead(GZ_PIN);
+ t = time_us;
+ send(t);
+ send(' ');
+ send(v);
+ send_line();
+ delayMicroseconds(450);
+ }
+ digitalWrite(DEBUG_LED1, LOW);
+ send("end");
+ send_line();
+}
+
void process_command(char cmd) {
int i;
if (cmd == CMD_SYNC_ZERO) {
@@ -359,6 +382,10 @@ void process_command(char cmd) {
send_ack(CMD_BRIGHTNESS_CURVE);
// This blocks all other execution for about 1 second
run_brightness_curve();
+ } else if (cmd == CMD_ACCELEROMETER_CURVE) {
+ send_ack(CMD_ACCELEROMETER_CURVE);
+ // This blocks all other execution for about 2 seconds
+ run_accelerometer_curve();
} else if (cmd == CMD_SAMPLE_ALL) {
send(flip_case(cmd));
send(" G:");
diff --git a/docs/DragLatency.md b/docs/DragLatency.md
index 3797e4e..739f477 100644
--- a/docs/DragLatency.md
+++ b/docs/DragLatency.md
@@ -1,6 +1,11 @@
## Drag / scroll latency
-For detailed instructions on how to perform the measurement refer to the [usage doc](usage/WALT_usage.md#dragscroll-latency).
+See also:
+ * Instructions on how to perform the measurement in the [usage doc](usage/WALT_usage.md#dragscroll-latency)
+ * [Video demonstration](https://www.youtube.com/watch?v=pVy5AYVzf7Q&list=PLd6Fi7WgXfcB4Ma6A-5rPlr1jptNR3RxQ&index=4)
+ * A [video](https://plus.google.com/+FrancoisBeaufort/posts/XctAif2nv4U) showing the measurement
+performed using a robotic stylus
+
For drag (or scroll) latency WALT uses a laser that shines across the touch device and hits a detector on the
other side. The microcontroller monitors the state of the laser detector and reports (over usb) when
@@ -8,10 +13,6 @@ the laser beam is broken. A finger dragged back and forth on a touchpad or touch
and interrupts a laser beam. Touch events from the pad and laser events are then processed together
to deduce the delay.
-A [video](https://plus.google.com/+FrancoisBeaufort/posts/XctAif2nv4U) showing the measurement
-performed using a robotic stylus.
-
-
![Drag/scroll latency measurement](usage/images/drag.png)
Sample measurements
diff --git a/docs/ScreenLatency.md b/docs/ScreenLatency.md
index 8a7f1a5..ea8b301 100644
--- a/docs/ScreenLatency.md
+++ b/docs/ScreenLatency.md
@@ -1,5 +1,9 @@
## Screen latency
+See also:
+ * [Video demonstration](https://www.youtube.com/watch?v=FePSFTxBux4&list=PLd6Fi7WgXfcB4Ma6A-5rPlr1jptNR3RxQ&index=3)
+ * [Screen latency section in the usage doc](usage/WALT_usage.md#screen-response-latency)
+
WALT can detect when screen changes color between white and black using a photodiode.
![Photo of bottom side of WALT](WALT_bottom_view.png)
diff --git a/docs/TapLatency.md b/docs/TapLatency.md
index a3f84ae..fd3ddac 100644
--- a/docs/TapLatency.md
+++ b/docs/TapLatency.md
@@ -27,6 +27,10 @@ Sample measurements
| Nexus 5X | NRD91P (7.0) | 25.0 | 22.5 | 2.4 |
| Nexus 7 | LMY47Q (5.1) | 29.6 | 31.0 | 1.4 |
| Nexus 9 | MMB29K (6.0.1) | 18.7 | 19.9 | 1.3 |
+| Pixel C | NMF26H (7.1.1) | 23.8 | 24.3 | 1.1 |
+| Pixel | NHG47K (7.1.2) | 9.6 | 28.1 | 2.0 |
+| Pixel XL | NHG47K (7.1.2) | 14.2 | 14.4 | 1.8 |
+
![Tap measurement](usage/images/tap.png)
diff --git a/docs/usage/WALT_usage.md b/docs/usage/WALT_usage.md
index 24fd990..a77e5d7 100644
--- a/docs/usage/WALT_usage.md
+++ b/docs/usage/WALT_usage.md
@@ -6,7 +6,7 @@ This document will show you how to set up and use your WALT.
About WALT:
* Source code: https://github.com/google/walt
- * [Youtube playlist](https://www.youtube.com/playlist?list=PLd6Fi7WgXfcCEJg1FDqNCoQfpWo7W3J5a)
+ * YouTube [playlist 1](https://www.youtube.com/playlist?list=PLd6Fi7WgXfcCEJg1FDqNCoQfpWo7W3J5a) and [playlist 2](https://www.youtube.com/playlist?list=PLd6Fi7WgXfcB4Ma6A-5rPlr1jptNR3RxQ)
* [Android Developers blog post](http://android-developers.blogspot.com/2016/04/a-new-method-to-measure-touch-and-audio.html)
## Prerequisites
@@ -32,6 +32,8 @@ A test device and cables:
## Setup
+[Video demonstration](https://www.youtube.com/watch?v=qR48GPepyxU&list=PLd6Fi7WgXfcB4Ma6A-5rPlr1jptNR3RxQ&index=2)
+
* Install and run the [WALT Android App](https://play.google.com/store/apps/details?id=org.kamrik.latency.walt&hl=en)
* Connect WALT to the Android headset using the 3.5mm male to male TRRS cable
* Connect WALT to the Android USB port using the cables above. (see photo at top of doc)
@@ -136,6 +138,8 @@ until the first frames of that buffer were detected by WALT device via the headp
## Screen response latency
+[Video demonstration](https://www.youtube.com/watch?v=FePSFTxBux4&list=PLd6Fi7WgXfcB4Ma6A-5rPlr1jptNR3RxQ&index=3)
+
* Tap screen response
* Set screen brightness to maximum. On phones using PWM for screen backlight brightness control, yo man need to turn adaptive brightness off (settings -> Display -> Adaptive Brightness)
* Position WALT with the screen sensor looking at the screen (the light sensor recessed into the large plastic surface).
@@ -231,6 +235,8 @@ Medians, p2k & k2c [ms]: 19.5 1.7
## Drag/scroll latency
+[Video demonstration](https://www.youtube.com/watch?v=pVy5AYVzf7Q&list=PLd6Fi7WgXfcB4Ma6A-5rPlr1jptNR3RxQ&index=4)
+
Drag latency is measured by dragging a finger up and down along the screen. The finger interrupts a laser beam positioned across the screen. By comparing the timings of those beam interruptions with Android touch events the WALT app calculates the delay.
diff --git a/hardware/WALT_schematic.pdf b/hardware/WALT_schematic.pdf
index de1f247..4157d62 100644
--- a/hardware/WALT_schematic.pdf
+++ b/hardware/WALT_schematic.pdf
Binary files differ
diff --git a/pywalt/README.md b/pywalt/README.md
index 2d5031e..bc8da91 100644
--- a/pywalt/README.md
+++ b/pywalt/README.md
@@ -9,24 +9,26 @@ Python scripts for [WALT Latency Timer](https://github.com/google/walt) on Linux
Synopsis:
```
-$ ./walt.py --help
-usage: walt.py [-h] [-i INPUT] [-s SERIAL] [-t TYPE] [-l LOGDIR] [-n N]
- [-p PORT] [-d]
+$ walt --help
+usage: walt [-h] [-i INPUT] [-s SERIAL] [-t TYPE] [-l LOGDIR] [-n N] [-p PORT]
+ [-d]
-Run the touchpad drag latency test using WALT Latency Timer
+Run a latency test using WALT Latency Timer
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
- input device, e.g: 6 or /dev/input/event6 (default: )
+ input device, e.g: 6 or /dev/input/event6 (default:
+ None)
-s SERIAL, --serial SERIAL
WALT serial port (default: /dev/ttyACM0)
- -t TYPE, --type TYPE Test type: drag|tap|screen|sanity|curve|bridge
- (default: drag)
+ -t TYPE, --type TYPE Test type:
+ drag|tap|screen|sanity|curve|bridge|tapaudio|tapblink
+ (default: None)
-l LOGDIR, --logdir LOGDIR
where to store logs (default: /tmp)
-n N Number of laser toggles to read (default: 40)
- -p PORT, --port PORT Port to listen on for the TCP bridge (default: 50007)
+ -p PORT, --port PORT port to listen on for the TCP bridge (default: 50007)
-d, --debug talk more (default: False)
```
diff --git a/pywalt/pywalt/walt.py b/pywalt/pywalt/walt.py
index 9987f4f..82536fd 100644
--- a/pywalt/pywalt/walt.py
+++ b/pywalt/pywalt/walt.py
@@ -674,7 +674,7 @@ class TcpServer:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
sock.bind((self.host, self.port))
- sock.listen(1)
+ sock.listen(10)
while True:
print('Listening on port %d' % self.port)
net, addr = sock.accept()